ActiveMq 配置多隊列


一直在趕項目,好久沒有寫博文了,中間偶爾有些代碼什么的,也都是放到github了,不過大多都是測試代碼,畢竟有些成型的東西是給公司寫的,鑒於職業道德,還是不好公開。

言歸正傳,這兩天在接入第三方的收費管理系統,后台有個掃描記錄的,數據然后發送到我這里,然后我來處理。

畢竟是走的restful的方式,說到底是比較多的http請求,他們不關心結果,只知道通信成功即可。於是,又用到了消息隊列。前面用的是activemq,這里需要再配置一個隊列。

如果不整合spring,用原生的activemq代碼來寫的話,多個隊列很容易實現。但是整合spring后,大多都是配置一個隊列。琢磨了一下,這里配置了兩個隊列,其實就是一個配置文件。因為是測試,這樣寫的有點不雅觀。

配置如下:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <!-- 消息中介-->
    <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <property name="brokerURL" value="tcp://127.0.0.1:61616?wireFormat.maxInactivityDuration=0"/>
        <property name="useAsyncSend" value="true" />
    </bean>

    <!-- 隊列目的地-->
    <bean id="myQueueOne" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg index="0" value="QueueDemoOne"/>
    </bean>
    <bean id="myQueueTwo" class="org.apache.activemq.command.ActiveMQQueue">
        <constructor-arg index="0" value="QueueDemoTwo" />
    </bean>

    <bean id="jmsTemplateOne" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory"/>
        <!-- 設置默認的消息目的地-->
        <property name="defaultDestination" ref="myQueueOne"/>
        <property name="deliveryMode" value="1"></property>
        <!-- 消息不持久化 -->
        <property name="explicitQosEnabled" value="true"></property>
        <!-- 由於receiver方法是同步的,所以我們在這里對接收設置超時時間-->
        <!--  <property name="receiveTimeout" value="60000"/>   -->
    </bean>
    <bean id="jmsTemplateTwo" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="connectionFactory"/>
        <!-- 設置默認的消息目的地-->
        <property name="defaultDestination" ref="myQueueTwo"/>
        <property name="deliveryMode" value="1"></property>
        <!-- 消息不持久化 -->
        <property name="explicitQosEnabled" value="true"></property>
    </bean>

    <!-- 消息發送者-->
    <bean id="producer1" class="com.ww.topic.SenderOne">
        <property name="jmsTemplate" ref="jmsTemplateOne"/>
        <!-- 消息目的地,因為jmsTemplate有默認的了,所以這里可以省略
        <property name="destination" ref=" myQueue "/>-->
    </bean>
    <bean id="producer2" class="com.ww.topic.SenderTwo">
        <property name="jmsTemplate" ref="jmsTemplateTwo"/>
        <!-- 消息目的地,因為jmsTemplate有默認的了,所以這里可以省略
        <property name="destination" ref=" myQueue "/>-->
    </bean>

    <!-- 消息接收監聽器用於異步接收消息-->
    <bean id="container1" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="destination" ref="myQueueOne"/>
        <property name="messageListener" ref="jmsListenerOne"/>
    </bean>
    <bean id="container2" class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="connectionFactory"/>
        <property name="destination" ref="myQueueTwo"/>
        <property name="messageListener" ref="jmsListenerTwo"/>
    </bean>

    <!-- 消息監聽實現方法一 -->
    <bean id="jmsListenerOne" class="com.ww.topic.ListenerOne">
    </bean>
    <bean id="jmsListenerTwo" class="com.ww.topic.ListenerTwo">
    </bean>

</beans>

其實是配置了兩個監聽器,然后把各自的destination ,sender,listener配置了兩個。

測試代碼:

sender:

package com.ww.topic;

import org.junit.Test;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.Session;
import javax.jms.TextMessage;

/**
 * Created by wang on 15-3-24.
 */
public class SenderOne {
    private JmsTemplate jmsTemplate;

    public JmsTemplate getJmsTemplate() {
        return jmsTemplate;
    }

    public void setJmsTemplate(JmsTemplate jmsTemplate) {
        this.jmsTemplate = jmsTemplate;
    }

    @Test
    public void sendQueue(){
        jmsTemplate.send(new MessageCreator() {
            @Override
            public Message createMessage(Session session) throws JMSException {
                TextMessage message = session.createTextMessage();
                message.setText("This is one sender");
                return message;
            }
        });
    }
}

listener:

package com.ww.topic;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

/**
 * Created by wang on 15-3-24.
 */
public class ListenerOne implements MessageListener {
    @Override
    public void onMessage(Message message) {
        TextMessage msg = (TextMessage) message;
        try {
            System.out.println("REC: "+msg.getText());
        } catch (JMSException e) {
            e.printStackTrace();
        }
    }
}

第二個和第一個是同理的代碼。

源碼下載:https://github.com/ThinkCats/Queue


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM