ActiveMQ Queue結合Spring

最近有個項目使用ActiveMQ,自己記錄一下Queue的使用情況。


maven管理的jar包(主要的):

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-jms</artifactId>
    <version>3.2.3.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.apache.geronimo.specs</groupId>
    <artifactId>geronimo-jms_1.1_spec</artifactId>
    <version>1.1</version>
</dependency>
<dependency>
    <groupId>org.apache.activemq</groupId>
    <artifactId>activemq-core</artifactId>
    <version>5.4.2</version>
    <exclusions>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging</artifactId>
        </exclusion>
        <exclusion>
            <groupId>commons-logging</groupId>
            <artifactId>commons-logging-api</artifactId>
        </exclusion>
    </exclusions>
</dependency>



Spring配置文件(ActiveMQ):

<?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-3.2.xsd">
    <description>JMS簡單應用配置</description>
    <!-- ActiveMQ 連接工廠 -->
    <bean id="connectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory">
        <!-- MQ服務地址 -->
        <property name="brokerURL" value="tcp://10.10.86.81:61616" />
        <!--  -->
        <property name="useAsyncSend" value="true"></property>
    </bean>
    <!-- Spring Caching 連接工廠 -->
    <bean id="cachingConnectionFactory"
        class="org.springframework.jms.connection.CachingConnectionFactory">
        <property name="targetConnectionFactory" ref="connectionFactory" />
        <!-- Session緩存數量 -->
        <property name="sessionCacheSize" value="20" />
    </bean>
    <!-- 接收消息的目的地(一個主題)點對點隊列 -->
    <bean id="myReceiveDestination" class="org.apache.activemq.command.ActiveMQQueue">
        <!-- 設置消息主題的名字 -->
        <constructor-arg index="0" value="messages" />
    </bean>
    <!-- 發送消息的目的地(一個主題)點對點隊列 -->
    <bean id="myDestination" class="org.apache.activemq.command.ActiveMQQueue">
        <!-- 設置消息主題的名字 -->
        <constructor-arg index="0" value="messages" />
    </bean>
    <!-- 接收配置JMS模版 -->
    <bean id="myJmsTemplate" class="org.springframework.jms.core.JmsTemplate">
        <property name="connectionFactory" ref="cachingConnectionFactory" />
        <property name="defaultDestination" ref="myReceiveDestination" />
    </bean>
    <!-- 生產消息配置 (自己定義) -->
    <bean id="myTriggerConsumer"
        class="com.xxx.xxx.xxx.TriggerReciveListener" />
    <!-- 消息監聽容器 -->
    <bean id="myListenerContainer"
        class="org.springframework.jms.listener.DefaultMessageListenerContainer">
        <property name="connectionFactory" ref="cachingConnectionFactory" />
        <property name="destination" ref="myReceiveDestination" />
        <property name="messageListener" ref="myTriggerConsumer" />
        <!-- 如果消息的接收速率,大於消息處理的速率時,可以採取線程池方式 -->
        <property name="taskExecutor" ref="queueMessageExecutor"></property>
        <!-- 設置固定的線程數 -->
        <property name="concurrentConsumers" value="30"></property>
        <!-- 設置動態的線程數 -->
        <property name="concurrency" value="20-50"></property>
        <!-- 設置最大的線程數 -->
        <property name="maxConcurrentConsumers" value="80"></property>
    </bean>
    <bean id="queueMessageExecutor"
        class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
        <property name="corePoolSize" value="30" />
        <property name="maxPoolSize" value="80" />
        <property name="daemon" value="true" />
        <property name="keepAliveSeconds" value="120" />
    </bean>
</beans>


自定義的消息監聽:

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.ObjectMessage;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
public class TriggerReciveListener implements MessageListener {
    private static final Logger LOG = LoggerFactory
            .getLogger(TriggerReciveListener.class);
                      
    @Autowired
    JMSSender jmsSender;
    @Override
    public void onMessage(Message message) {
        LOG.info("接收到信息,進行業務處理。");
        ObjectMessage message2 = (ObjectMessage) message;
        // 業務處理
    }
}



自定義的消息發送:

import java.io.Serializable;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.ObjectMessage;
import javax.jms.Session;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jms.core.JmsTemplate;
import org.springframework.jms.core.MessageCreator;
import org.springframework.stereotype.Component;
@Component
public class JMSSender {
                 
    private static final Logger LOG = LoggerFactory
            .getLogger(JMSSender.class);
    @Autowired
    JmsTemplate myJmsTemplate;
    /**
     * 自定義的消息推送
     * @param responseQueueName  隊列名稱
     * @param object 發送內容
     */
    public void send(String responseQueueName,final Object object) {
        LOG.info("發送消息到MQ"+responseQueueName);
        MessageCreator messageCreator = new MessageCreator() {
            public Message createMessage(Session session) throws JMSException {
                ObjectMessage message = session.createObjectMessage();
                             
                message.setObject((Serializable) object);
                return message;
            }
        };
        myJmsTemplate.send(responseQueueName, messageCreator);
    }
                 
    public void setJmsTemplate(JmsTemplate jmsTemplate) {
        this.myJmsTemplate = jmsTemplate;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章