說明:acitveMQ 版本爲:5.9.1,springboot 版本爲 2.0.3html
官方下載地址:點我跳轉,選擇 windows 安裝包下載,而後解壓,解壓後運行 bin 目錄下的activemq.bat啓動服務,無報錯便可啓動成功。默認管理地址爲:localhost:8161/admin,默認管理員帳號密碼爲admin/admin。java
建立 springboot web 項目,加入 spring-boot-starter-activemq 依賴。git
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> </dependency>
而後編輯配合文件,加上一個配置:61616 爲 activeMQ 的默認端口,暫時不作其餘配置,使用默認值。github
spring: activemq: broker-url: tcp://localhost:61616
springboot 中 activeMQ 的默認配置爲生產-消費者模式,還有一種模式爲發佈-訂閱模式後面再講。項目目錄以下:web
首先編寫配置類 Config.java,代碼以下spring
@Configuration public class Config { @Bean(name = "queue2") public Queue queue2(){ return new ActiveMQQueue("active.queue2"); } @Bean(name = "queue1") public Queue queue1(){ return new ActiveMQQueue("active.queue1"); } }
上面的代碼創建了兩個消息隊列 queue1,queue2,分別由 queue1 和 queue2 這兩個 Bean 注入到 Spring 容器中。程序運行後會在 activeMQ 的管理頁面->queue 中看到以下:apache
生產者 Producer.java 代碼以下:windows
@RestController public class Producer { @Autowired private JmsMessagingTemplate jmsMessagingTemplate; @Autowired() @Qualifier("queue2") private Queue queue2; @Autowired() @Qualifier("queue1") private Queue queue1; @GetMapping("/queue2") public void sendMessage1(String message){ jmsMessagingTemplate.convertAndSend(queue2,"I'm from queue2:"+message); } @GetMapping("/queue1") public void sendMessage2(String message){ jmsMessagingTemplate.convertAndSend(queue1,"I'm from queue1:"+message); } }
上面的類建立了兩個 GET 接口,訪問這兩個接口分別向 queue1 和 queue2 中發送消息。springboot
消費者 Comsumer.java 代碼以下:app
@Component //將該類註解到Spring 容器中 public class Comsumer { //接受消息隊列1消息 @JmsListener(destination = "active.queue1") //監聽active.queue1消息隊列 public void readActiveQueue11(String message){ System.out.println(1+message); } //接受消息隊列1消息 @JmsListener(destination = "active.queue1") public void readActiveQueue12(String message){ System.out.println(2+message); } //接受消息隊列2消息 @JmsListener(destination = "active.queue2") public void readActiveQueue21(String message){ System.out.println(1+message); } //接受消息隊列2消息 @JmsListener(destination = "active.queue2") public void readActiveQueue22(String message){ System.out.println(2+message); } }
上面的代碼定義了 4 個消費者,每兩個消費一個消息隊列。
啓動項目後分別向/queue1?message=niihao,/queue2?message=nihaoa 發送 http 請求,而後咱們能夠在控制檯中看到以下輸出:
2I'm from queue2:nihaoa 1I'm from queue2:nihaoa 2I'm from queue1:nihao 1I'm from queue1:nihao
消息都成功被消費者消費,從打印結果也可看出生產者消費者的一個特色:一個消息只會被一個消費者消費。同時在管理頁面中能夠看到:
每一個消息隊列有兩個消費者,隊列進入了三個消息,出了三個消息,說明消息都被消費掉了,若是註釋掉消費者代碼,再次運行,而後發送消息就會發現 MessagesEnqueued 數量大於 MessagesDequeued,而後再讓消費者上線會當即消費掉隊列中的消息。
本文原創發佈於:https://www.tapme.top/blog/detail/2018-09-05-10-38
源碼:https://github.com/FleyX/demo-project/tree/master/jms_demo