spring+mq實現非同步處理
阿新 • • 發佈:2018-12-15
最近研究了一下spring/spring boot與activeMq的整合,花費了很多時間,也遇到了很多坑,工作之餘,總結一下。
業務邏輯是這樣的,有一個功能(比如使用者註冊)執行十分緩慢,但是實際需要發起請求之後馬上提示“處理成功”而不關心是否真的處理成功,這種情況就可以交給MQ來處理。
本文章不再介紹springMVC的搭建與activeMq的安裝,有需要的讀者可以自行學習。
下面直接釋出程式碼:
1、引入mq相關依賴
<!-- 適用於springMVC --> <dependency> <groupId>org.apache.activemq</groupId> <artifactId>activemq-spring</artifactId> <version>5.14.5</version> </dependency>
2、編寫mq資原始檔mq-config.properties並引入
spring.activemq.broker-url=tcp://127.0.0.1:61616
spring.activemq.user=admin
spring.activemq.password=admin
# 支援所有的包,詳見http://activemq.apache.org/objectmessage.html
spring.activemq.packages.trust-all=true
3、編寫mq配置檔案(spring-mq.xml)並引入
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:amq="http://activemq.apache.org/schema/core" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.14.5.xsd"> <!--設定activeMq的屬性,包括使用者名稱密碼--> <amq:connectionFactory id="amqConnectionFactory" brokerURL="${spring.activemq.broker-url}" userName="${spring.activemq.user}" password="${spring.activemq.password}"/> <!--連線池,注意最好不要簡單地命名為connectionFactory,容易與其他連線池重名--> <bean id="myMqConnectionFactory" class="org.springframework.jms.connection.CachingConnectionFactory"> <property name="targetConnectionFactory" ref="amqConnectionFactory"></property> <!-- 會話的最大連線數 --> <property name="sessionCacheSize" value="10"></property> </bean> <!--配置生產者--> <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate"> <property name="connectionFactory" ref="myMqConnectionFactory"></property> </bean> <!-- 佇列,注意命名,這裡假設模擬註冊,就叫registerQueue--> <bean id="registerQueue" class="org.apache.activemq.command.ActiveMQQueue"> <!--構造引數中name的值,最終會顯示在mq控制檯的Queues列表中--> <constructor-arg value="register"></constructor-arg> </bean> <!--監聽器--> <bean id="registerListener" class="com.zcx.listener.RegisterListener"></bean> <bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="myMqConnectionFactory"></property> <property name="destination" ref="registerQueue"></property> <property name="messageListener" ref="registerListener"></property> </bean> </beans>
4、傳送訊息到訊息佇列
public void execute_String() {
String s = "hi,mq!";
jmsTemplate.convertAndSend(registerQueue, s);
}
5、接收訊息
public class RegisterListener implements MessageListener{ public void onMessage(Message message) { try { // 接收String if (message instanceof TextMessage) { TextMessage tm = (TextMessage) message; String result = tm.getText(); System.out.println(result); } } catch (JMSException e) { e.printStackTrace(); } } }