springMVC+activemq整合注解方式

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



猜你喜欢

转载自blog.csdn.net/bjjoy2009/article/details/53984345
今日推荐