前言:用了一次mq,由于xml配置+注解的方式出现类加载问题并且对spring类加载机制不是很熟悉,索性就改成注解方式来解决问题。
配置过程中,搜索了好久,各种配置失败,这里给出总结经验,勉励一下自己吧。
1.xml监听配置方式及测试程序,请参阅
http://www.cnblogs.com/leiOOlei/p/5075402.html
2.activemq注解监听配置如下
(1)请自行配置springmvc+maven环境(参看前几篇博客),下载activemq
(2)maven引入的包,在pom.xml文件引入。
注意:activemq-all用的5.8.0,同时测试了5.12.1和5.14.3版本,无法识别<jms:annotation-driven/>配置,不能实现注解。
这里困扰好久,望有成功者可以指点一二,感激不尽。
<dependency>
<groupId>org.apache.xbean</groupId>
<artifactId>xbean-spring</artifactId>
<version>4.5</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jms</artifactId>
<version>4.1.0.RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.activemq</groupId>
<artifactId>activemq-all</artifactId>
<version>5.8.0</version>
</dependency>
(3)activemq.xml文件配置
<?xml version="1.0" encoding="UTF-8"?> <!-- 查找最新的schemaLocation 访问 http://www.springframework.org/schema/ --> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:amq="http://activemq.apache.org/schema/core" xmlns:jms="http://www.springframework.org/schema/jms" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms-4.1.xsd http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core-5.8.0.xsd"> <amq:connectionFactory id="jmsConnectionFactory" brokerURL="tcp://localhost:61616" userName="admin" password="admin" /> <bean id="jmsConnectionFactoryExtend" class="org.springframework.jms.connection.CachingConnectionFactory"> <constructor-arg ref="jmsConnectionFactory" /> <property name="sessionCacheSize" value="100" /> </bean> <!-- 消息处理器 --> <bean id="jmsMessageConverter" class="org.springframework.jms.support.converter.SimpleMessageConverter" /> <!-- ====Producer side start==== --> <!-- 定义JmsTemplate的Queue类型 --> <bean id="jmsQueueTemplate" class="org.springframework.jms.core.JmsTemplate"> <constructor-arg ref="jmsConnectionFactoryExtend" /> <!-- 非pub/sub模型(发布/订阅),即队列模式 --> <property name="pubSubDomain" value="false" /> <property name="messageConverter" ref="jmsMessageConverter"></property> </bean> <!-- 定义JmsTemplate的Topic类型 --> <bean id="jmsTopicTemplate" class="org.springframework.jms.core.JmsTemplate"> <constructor-arg ref="jmsConnectionFactoryExtend" /> <!-- pub/sub模型(发布/订阅) --> <property name="pubSubDomain" value="true" /> <property name="messageConverter" ref="jmsMessageConverter"></property> </bean> <bean id="jmsListenerContainerFactory" class="org.springframework.jms.config.DefaultJmsListenerContainerFactory"> <property name="connectionFactory" ref="jmsConnectionFactoryExtend"/> </bean> <!-- 监听注解支持 --> <jms:annotation-driven /> </beans>(4)监听消息测试代码, 注意:类上面的两个注解,丢了无法启动监听
package com.cms.mmc.activemq; import java.util.List; import java.util.Map; import javax.annotation.Resource; import javax.jms.JMSException; import javax.jms.Message; import javax.jms.TextMessage; import org.springframework.jms.annotation.EnableJms; import org.springframework.jms.annotation.JmsListener; import org.springframework.stereotype.Component; import com.cms.mmc.activemq.service.IServiceProducer; //spring配置监听队列中的消息 @Component @EnableJms public class QueueMsgListener{ //当收到消息后,自动调用该方法,spring配置默认监听器,负责接收消息 @JmsListener(containerFactory="jmsListenerContainerFactory",destination = "mssactivemq") public void onMessage(Message message) { TextMessage tm = (TextMessage) message; try { System.out.println(tm.getText()); } catch (JMSException e) { e.printStackTrace(); } } }(5)测试监听启动,启动tomcat,启动activemq,:\apache-activemq-5.14.3\bin\win64,双击activemq.bat,启动后
浏览器输入http://localhost:8161/admin,未修改密码情况,用户名密码admin admin。看到如下图片,number of consumers =1,
当向mssactivemq队列发送消息时,会在控制台打印该消息,发送消息程序请看(6),输出如下
{"code":"equipment","commKey":"send","pId":"00ec55041f7c4534a4b6740b9187cf5d","id":"222","items":"json对象","key":"222_00ec55041f7c4534a4b6740b9187cf5d"}
(6)发送消息测试代码如下
package com.cms.mmc.activemq; import javax.jms.Connection; import javax.jms.ConnectionFactory; import javax.jms.Destination; import javax.jms.JMSException; import javax.jms.MessageProducer; import javax.jms.Session; import javax.jms.TextMessage; import org.apache.activemq.ActiveMQConnectionFactory; import org.springframework.jms.core.JmsTemplate; import com.alibaba.fastjson.JSONObject; //向mq发送2条数据 public class M2Producer { public M2Producer(){ } public static void main(String[] args) { ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("tcp://localhost:61616"); try { Connection connection = connectionFactory.createConnection(); connection.start(); Session session = connection.createSession(Boolean.TRUE,Session.AUTO_ACKNOWLEDGE); Destination destination = session.createQueue("mssactivemq"); MessageProducer producer = session.createProducer(destination); JSONObject jsonObject = new JSONObject(); jsonObject.put("commKey", "send"); jsonObject.put("id", "222"); jsonObject.put("pId", "00ec55041f7c4534a4b6740b9187cf5d"); jsonObject.put("key", "222_00ec55041f7c4534a4b6740b9187cf5d"); jsonObject.put("items", "json对象"); jsonObject.put("code", "equipment"); for (int i = 0; i < 1; i++) { System.out.println("send...messageAA --->" + jsonObject); TextMessage message = session.createTextMessage(jsonObject.toJSONString()); // 通过生产者发出消息 producer.send(message); } session.commit(); session.close(); connection.close(); } catch (JMSException e) { e.printStackTrace(); } } }