Spring Boot基於Active MQ實現整合JMS
我們使用jms一般是使用spring-jms和activemq相結合,通過spring Boot為我們配置好的JmsTemplate傳送訊息到指定的目的地Destination。本文以點到點訊息模式為例,演示如何在Spring Boot中整合 JMS 和 Active MQ ,實現 MQ 訊息的生產與消費。
點到點訊息模式定義:當訊息傳送者傳送訊息,訊息代理獲得訊息後,把訊息放入一個佇列裡,當有訊息接收者來接收訊息的時候,訊息將從佇列裡取出並且傳遞給接收者,這時候佇列裡就沒有此訊息了。佇列Queue的存在使得訊息的非同步傳輸成為可能。
1 安裝ActiveMQ
關於具體的安裝步驟,請參考專門介紹安裝與部署的另一篇博文《ActiveMQ的安裝與部署》。
2 配置Active MQ 依賴
關於如何搭建 Spring Boot工程,請移步《基於 intellij IDEA 快速搭建Spring Boot專案》。假設專案已經建立完畢,在專案 pom 檔案中加入Active MQ依賴:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-activemq</artifactId> <version>2.2.7.RELEASE</version> </dependency>
3 修改application.properties配置檔案
在application.properties中配置Active MQ:
spring.activemq.broker-url=tcp://localhost:61616
spring.activemq.in-memory=true
spring.activemq.pool.enabled=false
#預設值false,表示點到點模式,true時代表釋出訂閱模式
spring.jms.pub-sub-domain=false
4 建立訊息生產者和消費者
本文以點到點訊息模式演示。新增訊息生產者:
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.jms.core.JmsMessagingTemplate; import org.springframework.stereotype.Service; import javax.jms.Destination; @Service("producer") public class Producer { /** * 也可以注入JmsTemplate,JmsMessagingTemplate對JmsTemplate進行了封裝 */ @Autowired private JmsMessagingTemplate jmsTemplate; /** * 傳送訊息,destination是傳送到的佇列,message是待發送的訊息 * * @param destination * @param message */ public void sendMessage(Destination destination,final String message) { jmsTemplate.convertAndSend(destination,message); } }
通過JmsMessagingTemplate 的convertAndSend方法向目的地 destination傳送訊息。 新增訊息監聽者:
import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; @Component public class ConsumerListener { private static Logger logger = LoggerFactory.getLogger(Consumer.class); /** * 使用JmsListener配置消費者監聽的佇列 * @param receivedMsg 接收到的訊息 */ @JmsListener(destination = "myDest.queue") public void receiveQueue(String receivedMsg) { logger.info("Consumer收到的報文為: {}",receivedMsg); } }
@JmsListener是Spring 4.1 提供的一個新特性,用於簡化JMS開發,只需使用此註解的屬性destination指定要監聽的目的地【myDest.queue】,即可接收該目的地傳送的訊息。消費者2 ConsumerListener2 的程式碼同上,但是日誌如下:
logger.info("Consumer2收到的報文為: {}",receivedMsg);
溫馨提示,訊息消費者和生產者的類上必須加上註解 @Component 或者 @Service,使得訊息消費者類就會被委派給Listener類,原理類似於使用SessionAwareMessageListener以及MessageListenerAdapter來實現訊息驅動POJO。
5 測試 MQ
在Junit測試類中新增測試方法
import org.apache.activemq.command.ActiveMQQueue; import javax.jms.Destination; @Autowired private Producer producer; @Test public void jmsActiveMqTest() throws InterruptedException { Destination destination = new ActiveMQQueue("myDest.queue"); for (int i = 0; i < 21; i++) { producer.sendMessage(destination,String.format("My name is Wiener%s",i)); } }
控制檯顯示消費者接收到的訊息如下:
Consumer收到的報文為: My name is Wiener0
Consumer2 收到的報文為:My name is Wiener1
Consumer收到的報文為: My name is Wiener2
Consumer2 收到的報文為:My name is Wiener3
Consumer收到的報文為: My name is Wiener4
Consumer2 收到的報文為:My name is Wiener5
Consumer收到的報文為: My name is Wiener6
Consumer2 收到的報文為:My name is Wiener7
...
經過上面的五個步驟,spring Boot、Jms 和 Active MQ 就基本上整合完成了,是不是使用起來很方便了!
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。