最近有个项目使用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; } }