Activemq,消息傳送的中間件,用於在兩個系統中傳送消息,做測試的時候是可以傳送字符串。當然也可以傳送對象數據信息。
Activemq有兩種模式,queue和topic。Queue是隊列,有人消費了就消失了,如果是集羣的話,集羣中的每個系統接收到的消息就會是不一樣的。而集羣作爲一個整體來消費這些消息。Topic是主題與訂閱模式,所有訂閱了這個消息的系統,都會接收到一套完整的信息,也就是集羣中的每個子系統接收到的消息是一致的。
整體環境搭建
安裝了apache-activemq-5.15.3-bin.tar.gz包與jdk-8u191-linux-x64.tar.gz包。將這兩個解壓到/apps/svr/目錄下,就算是搭建起來環境了。
啓動activemq
cd /apps/svr/apache-activemq-5.15.3/bin
然後輸入命令:
./activemq start
完成對activemq的啓動。
activemq啓動後默認會用到8161端口和61616端口,需要檢查這兩個端口是否開通。
使用下面的兩個命令可以暫時開啓兩個端口,如需持久化開啓端口,參考百度
iptables -I INPUT -p tcp --dport 8161 -j ACCEPT
iptables -I INPUT -p tcp --dport 61616 -j ACCEPT
這樣的話,activemq消息中間件就準備齊全了。在瀏覽器上輸入網址http://ip:8161/即可訪問active的網頁,密碼爲admin/admin.
activemq的操作
首先https://start.spring.io/下載兩個springboot初始化項目,一個用於做消息的生產者provider,一個是消息的消費者consumer。
項目下載完成後導入eclipse中,在pom.xml文件中增加依賴:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-activemq</artifactId>
</dependency>
然後在application.properties中添加相關配置信息。
spring.activemq.broker-url=tcp://ip:61616
spring.activemq.user=admin
spring.activemq.password=admin
spring.activemq.pool.enabled=false
server.port=9091(因爲每個項目中默認爲8080端口,所以需要修改端口號,以免出現端口被佔用的情況)
queue模式
新建一個Consumer.java類,編寫如下信息:
import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Service;
@Service public class Consumer {
@JmsListener(destination = "test.queueue") public void receiveMsg(String text) { System.out.println("<<<<<<<================收到消息:" + text); } } |
這樣便有了一個消費者
在另一個項目中新建一個Producer.java類,編寫如下信息:
import javax.annotation.Resource; import javax.jms.Destination;
import org.apache.activemq.command.ActiveMQQueue; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.stereotype.Service;
@Service public class Producer {
@Resource private JmsMessagingTemplate jmsMessagingTemplate;
public void sendMsg(String destinationName, String message) { System.out.println("================發送queue消息爲================"+message); Destination destination = new ActiveMQQueue(destinationName); jmsMessagingTemplate.convertAndSend(destination, message); } } |
這樣便有了一個消息的提供者,在消息的提供者中編寫測試用例如下:
import javax.annotation.Resource;
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class) @SpringBootTest public class DemoApplicationTests {
@Resource private Producer producer;
@Test public void sendMsgTest() { for(int i=0; i < 10; i++) { producer.sendMsg("test.queueue", "queue message=======" + i); } } }
|
打開測試用例,消息提供者便會發送消息,而消息的消費者就會消費消息。
Topic模式
Topic模式與queue步驟是一樣的,只是個別類有些不同。
新建一個Subscriber.java類,編寫如下信息:
import javax.jms.ConnectionFactory;
import org.springframework.context.annotation.Bean; import org.springframework.jms.annotation.JmsListener; import org.springframework.jms.config.JmsListenerContainerFactory; import org.springframework.jms.config.SimpleJmsListenerContainerFactory; import org.springframework.stereotype.Service;
@Service public class Subscriber {
@JmsListener(destination="test.topic", containerFactory="myJmsContainerFactory") public void subscribe(String text) { System.out.println("===================<<<<<收到訂閱的消息" + text); }
@Bean JmsListenerContainerFactory<?> myJmsContainerFactory(ConnectionFactory connectionFactory){ SimpleJmsListenerContainerFactory factory = new SimpleJmsListenerContainerFactory(); factory.setConnectionFactory(connectionFactory); factory.setPubSubDomain(true); return factory; } }
|
這樣便有了一個消費者
在另一個項目中新建一個Publisher.java類,編寫如下信息:
import javax.annotation.Resource; import javax.jms.Destination;
import org.apache.activemq.command.ActiveMQTopic; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.stereotype.Service;
@Service public class Publisher {
@Resource private JmsMessagingTemplate jmsMessagingTemplate;
public void publish(String destinationName, String message) { Destination destination = new ActiveMQTopic(destinationName); System.out.println("==============>>>>>>發佈topic消息" + message); jmsMessagingTemplate.convertAndSend(destination, message); } } |
這樣便有了一個消息的提供者,在消息的提供者中編寫測試用例如下:
import javax.annotation.Resource;
import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class) @SpringBootTest public class DemoApplicationTests { @Resource private Publisher publisher;
@Test public void sendMsgTopicTest() { for(int i=0; i < 10; i++) { publisher.publish("test.topic", "topic message=======" + i); } } } |
打開測試用例,消息提供者便會發送消息,而消息的消費者就會消費消息。