1. 程式人生 > >spring+mq實現非同步處理

spring+mq實現非同步處理

最近研究了一下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();
       	 }
    }
}