前言:用了一次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();
}
}
}