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();
       	 }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章