到Apache官方網站下載最新的ActiveMQ的安裝包,並解壓到本地目錄下,下載連接以下:http://activemq.apache.org/do...。
html
進入bin 目錄,若是咱們是32位的機器,就雙擊 win32 目錄下的 activemq.bat,若是是64位機器,則雙擊 win64 目錄下的 activemq.bat ,運行結果以下:
成功以後在瀏覽器輸入 http://127.0.0.1:8161/ 地址,能夠看到 ActiveMQ 的管理頁面,用戶名和密碼默認都是 admin
java
工程結構
spring
添加 pom 依賴shell
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency>
config 配置apache
# activemq spring.activemq.broker-url=tcp://localhost:61616 spring.activemq.user=admin spring.activemq.password=admin #默認爲true表示使用內存的activeMQ,不須要安裝activeMQ server spring.activemq.in-memory=true #若是此處設置爲true,須要加以下的依賴包 # <groupId>org.apache.activemq</groupId> # <artifactId>activemq-pool</artifactId> # 不然會自動配置失敗,報JmsMessagingTemplate注入失敗 spring.activemq.pool.enabled=false
建立 消息提供者:Producer.java瀏覽器
import javax.jms.Destination; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.stereotype.Service; @Service public class Producer { @Autowired // 也能夠注入JmsTemplate,JmsMessagingTemplate對JmsTemplate進行了封裝 private JmsMessagingTemplate jmsTemplate; // 發送消息,destination是發送到的隊列,message是待發送的消息 public void sendMessage(Destination destination, final String message){ jmsTemplate.convertAndSend(destination, message); } }
建立消費者一: Consumer.javadom
import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; @Component public class Consumer { // 使用JmsListener配置消費者監聽的隊列,其中text是接收到的消息 @JmsListener(destination = "mytest.queue") public void receiveQueue(String text) { System.out.println("Consumer收到的報文爲:"+text); } }
建立消費者二:Consumer1 .javatcp
import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; @Component public class Consumer1 { // 使用JmsListener配置消費者監聽的隊列,其中text是接收到的消息 @JmsListener(destination = "mytest.queue") public void receiveQueue(String text) { System.out.println("Consumer1收到的報文爲:"+text); } }
測試spring-boot
建立一個 ActivceMQQueue 對象,表示隊列模式,下面會介紹主題模式。測試
import org.apache.activemq.command.ActiveMQQueue; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import javax.jms.Destination; @RunWith(SpringRunner.class) @SpringBootTest public class JmsApplicationTests { @Autowired private Producer producer; @Test public void contextLoads() { Destination destination = new ActiveMQQueue("mytest.queue"); for(int i=0; i<100; i++){ producer.sendMessage(destination, "myname is chhliu!!!"); } } }
使用 @SendTo 註解能夠將方法的返回值從新放入到消息隊列中,供其餘消費者消費
這裏咱們修改 Consumer1.java 增長註解 @SendTo
public class Consumer1 { // 使用JmsListener配置消費者監聽的隊列,其中text是接收到的消息 @JmsListener(destination = "mytest.queue") @SendTo("out.queue") public String receiveQueue(String text) { System.out.println("Consumer1收到的報文爲:"+text); return "return message" + text; } @JmsListener(destination = "out.queue") public void outQueue(String text){ System.out.println("Consumer1 outQueue:"+text); } }
配置文件中須要增長
# 啓用 topic 模式 spring.jms.pub-sub-domain=true
修改 Consumer1 增長對主題的監聽
import org.springframework.jms.annotation.JmsListener; import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.stereotype.Component; @Component public class Consumer1 { // 使用JmsListener配置消費者監聽的隊列,其中text是接收到的消息 @JmsListener(destination = "mytest.queue") @SendTo("out.queue") public String receiveQueue(String text) { System.out.println("Consumer1 收到的報文爲:"+text); return "return message" + text; } @JmsListener(destination = "out.queue") public void outQueue(String text){ System.out.println("Consumer1 outQueue:"+text); } @JmsListener(destination = "mytest.topic") public void topicQueue(String text){ System.out.println("Consumer 接收到的 topic 消息:" + text); } }
修改測試類
增長髮送主題消息
import org.apache.activemq.command.ActiveMQQueue; import org.apache.activemq.command.ActiveMQTopic; import org.junit.Test; import org.junit.runner.RunWith; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.context.SpringBootTest; import org.springframework.test.context.junit4.SpringRunner; import javax.jms.Destination; @RunWith(SpringRunner.class) @SpringBootTest public class JmsApplicationTests { @Autowired private Producer producer; @Test public void contextLoads() { Destination destination = new ActiveMQQueue("mytest.queue"); Destination topicDestination = new ActiveMQTopic("mytest.topic"); for(int i=0; i<10; i++){ producer.sendMessage(destination, "Queue Message......"); producer.sendMessage(topicDestination, "Topic Message!!!"); } } }
消息的結果爲:
沒有出現 隊列消息。此時須要修改咱們的監聽,指定出是哪一種類型的
增長配置類
這個配置類沒有在那個工程圖上面出現,添加一個類就好。
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.jms.annotation.EnableJms; import org.springframework.jms.config.DefaultJmsListenerContainerFactory; import org.springframework.jms.config.JmsListenerContainerFactory; import javax.jms.ConnectionFactory; @Configuration @EnableJms public class JmsConfig { @Bean public JmsListenerContainerFactory<?> topicListenerFactory(ConnectionFactory connectionFactory) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setPubSubDomain(true); factory.setConnectionFactory(connectionFactory); return factory; } @Bean public JmsListenerContainerFactory<?> queueListenerFactory(ConnectionFactory connectionFactory) { DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory(); factory.setPubSubDomain(false); factory.setConnectionFactory(connectionFactory); return factory; } }
修改消費者 Consumer1.java
import org.springframework.jms.annotation.JmsListener; import org.springframework.messaging.handler.annotation.SendTo; import org.springframework.stereotype.Component; @Component public class Consumer1 { // 使用JmsListener配置消費者監聽的隊列,其中text是接收到的消息 @JmsListener(destination = "mytest.queue", containerFactory = "queueListenerFactory") @SendTo("out.queue") public String receiveQueue(String text) { System.out.println("Consumer1 收到的報文爲:"+text); return "return message" + text; } @JmsListener(destination = "out.queue", containerFactory = "queueListenerFactory") public void outQueue(String text){ System.out.println("Consumer1 outQueue:"+text); } @JmsListener(destination = "mytest.topic", containerFactory = "topicListenerFactory") public void topicQueue(String text){ System.out.println("Consumer 接收到的 topic 消息:" + text); } }
從新執行