ActiveMQ与Spring整合:(3)消息监听器

原创 2016年08月29日 21:34:10

        JMS监听器有三种消息监听器实现:MessageListener,SessionAwareMessageListener,MessageListenerAdapter。消息接受者只需要实现这些接口就可以异步接收消息。

1、实现MessageListener接口,实现MessageListener接口,必须重写onMessage方法。

package com.hua.spring.jms.listener;

import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;


/**
 * @description
 * @date:(2016-8-25 下午10:01:07)
 * @author Administrator
 * @version v1.0
 * @since v1.0
 *
 * Modified history
 *
 *    Modified date:  
 *    Modifier user:     
 *    description: 
 *
 * */
public class ResponseQueueMessageListener implements MessageListener{
	
	private Logger logger=LoggerFactory.getLogger(ResponseQueueMessageListener.class);

	@Override
	public void onMessage(Message message) {
		if(message instanceof TextMessage){
			try {
				String text=((TextMessage) message).getText();
				logger.info("消息生产者接收到响应:"+text);
			} catch (JMSException e) {
				logger.error("消息生产者接收消息时发生异常:",e);
				
			}
			
		}
		
	}

}
消息监听器需要注册到消息监听容器中,示例配置:

<?xml version="1.0" encoding="UTF-8"?>
<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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.2.xsd">
    
	<!-- 连接池  -->
    <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">  
        <property name="connectionFactory">  
            <!-- 连接工厂 -->
            <bean class="org.apache.activemq.ActiveMQConnectionFactory">  
                <property name="brokerURL" value="tcp://localhost:61616" />  
            </bean>  
        </property>
         <property name="maxConnections" value="10"/>   
    </bean> 
    
    <!-- 消息模板 -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
        <property name="connectionFactory" ref="pooledConnectionFactory" />  
        <property name="defaultDestination" ref="queueDestination" />  
        <property name="messageConverter">  
            <bean class="org.springframework.jms.support.converter.SimpleMessageConverter" />
       </property>
         <!-- 消息转换器 -->  
<!--     	<property name="messageConverter" ref="emailMessageConverter"/> -->
    </bean>
    
      <!-- 配置消息目标 -->
    <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">  
        <!-- 目标,在ActiveMQ管理员控制台创建 http://localhost:8161/admin/queues.jsp -->
        <constructor-arg index="0" value="helloQueue" />  
    </bean> 
    <!-- 用于测试消息回复的 -->  
	<bean id="responseQueue" class="org.apache.activemq.command.ActiveMQQueue">  
	    <constructor-arg>  
	        <value>responseQueue</value>  
	    </constructor-arg>  
	</bean>
    
      <!-- 消息监听器 -->  
    <bean id="responseMessageListener" class="com.hua.spring.jms.listener.ResponseQueueMessageListener"/>  
    
     <!-- 消息监听容器 -->   
    <bean id="responseQueueListenerAdapter" class=" org.springframework.jms.listener.DefaultMessageListenerContainer">  
          <property name="connectionFactory" ref="pooledConnectionFactory" />  
        <property name="destination" ref="responseQueue" />  
        <property name="messageListener" ref="responseMessageListener" /> 
         <property name="sessionTransacted" value="false"/> 
    </bean>
  
 
    
    
</beans>
2、实现SessionAwareMessageListener接口,实现这个接口需要实现void onMessage(Message message, Session session)方法。这个接口与MessageListener接口不同之处在于,参数里面有Session参数,消息接受者接收消息之后可通过session进行回复消息发送者。

package com.hua.spring.jms.listener;

import javax.jms.Destination;
import javax.jms.JMSException;
import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.MessageProducer;
import javax.jms.Session;
import javax.jms.TextMessage;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.jms.listener.SessionAwareMessageListener;

/**
 * @description
 * @date:(2016-8-28 上午9:49:32)
 * @author Administrator
 * @version v1.0
 * @since v1.0
 *
 * Modified history
 *
 *    Modified date:  
 *    Modifier user:     
 *    description: 
 *
 * */
public class QueueDestinationMessageListener implements SessionAwareMessageListener<Message>{
	
	private Logger logger=LoggerFactory.getLogger(QueueDestinationMessageListener.class);
	
	private Destination destination;

	@Override
	public void onMessage(Message message, Session session) throws JMSException {
		if(message instanceof TextMessage){
			try {
				String text=((TextMessage)message).getText();
				logger.info("接受者:我收到消息-->"+text);
				
				MessageProducer producer = session.createProducer(destination);  
		        Message textMessage = session.createTextMessage("Hello sender! I have received your news.");  
		        producer.send(textMessage);
				
			} catch (JMSException e) {
				logger.error("监听消息发生异常",e);
		
			}
			
		}
		
	}

	public Destination getDestination() {
		return destination;
	}

	public void setDestination(Destination destination) {
		this.destination = destination;
	}

}
同时把消息监听器注册到监听器容器中:

<?xml version="1.0" encoding="UTF-8"?>
<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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.2.xsd">
    
	<!-- 连接池  -->
    <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">  
        <property name="connectionFactory">  
            <!-- 连接工厂 -->
            <bean class="org.apache.activemq.ActiveMQConnectionFactory">  
                <property name="brokerURL" value="tcp://localhost:61616" />  
            </bean>  
        </property>
         <property name="maxConnections" value="10"/>   
    </bean> 
    
    <!-- 消息模板 -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
        <property name="connectionFactory" ref="pooledConnectionFactory" />  
        <property name="defaultDestination" ref="queueDestination" />  
        <property name="messageConverter">  
            <bean class="org.springframework.jms.support.converter.SimpleMessageConverter" />
       </property>
         <!-- 消息转换器 -->  
<!--     	<property name="messageConverter" ref="emailMessageConverter"/> -->
    </bean>
    
      <!-- 配置消息目标 -->
    <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">  
        <!-- 目标,在ActiveMQ管理员控制台创建 http://localhost:8161/admin/queues.jsp -->
        <constructor-arg index="0" value="helloQueue" />  
    </bean> 
    <!-- 用于测试消息回复的 -->  
	<bean id="responseQueue" class="org.apache.activemq.command.ActiveMQQueue">  
	    <constructor-arg>  
	        <value>responseQueue</value>  
	    </constructor-arg>  
	</bean>
	
	    <!-- 可以获取session的MessageListener -->  
    <bean id="queueDestinationMessageListener" class="com.hua.spring.jms.listener.QueueDestinationMessageListener">  
        <property name="destination" ref="responseQueue"/>
    </bean> 
    
     <!-- 消息监听容器 -->   
    <bean id="responseQueueListenerAdapter" class=" org.springframework.jms.listener.DefaultMessageListenerContainer">  
          <property name="connectionFactory" ref="pooledConnectionFactory" />  
        <property name="destination" ref="queueDestination" />  
        <property name="messageListener" ref="queueDestinationMessageListener" /> 
         <property name="sessionTransacted" value="false"/> 
    </bean>
  
 
    
    
</beans>
3、MessageListenerAdapter接口,MessageListenerAdapter接口由MessageListener, SessionAwareMessageListener扩展而来。消息监听类只需要实现重载handleMessage方法,最终监听器会动态匹配参数。

package com.hua.spring.jms.listener;

import java.util.Map;

/**
 * @description
 * @date:(2016-8-29 下午9:19:25)
 * @author Administrator
 * @version v1.0
 * @since v1.0
 *
 * Modified history
 *
 *    Modified date:  
 *    Modifier user:     
 *    description: 
 *
 * */
public class JMSReceiver {
	
	/**
	 * 接收一条转换的TextMessage消息
	 * */
	public void handleMessage(String message){
		System.out.println(message);
	}
	
	/**
	 *接收一条转换的ByteMessage消息
	 * */
	public void handleMessage(byte[] message){
		
	}
	
	/**
	 * 接收一条转换的MapMessage消息
	 * */
	public void handleMessage(Map message){

	}
	
	/**
	 * 接收一条转换的ObjectMessage消息
	 * */
	public void handleMessage(Object message){

	}
	
}
applicationContext.xml配置

<?xml version="1.0" encoding="UTF-8"?>
<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"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.2.xsd">
    
	<!-- 连接池  -->
    <bean id="pooledConnectionFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">  
        <property name="connectionFactory">  
            <!-- 连接工厂 -->
            <bean class="org.apache.activemq.ActiveMQConnectionFactory">  
                <property name="brokerURL" value="tcp://localhost:61616" />  
            </bean>  
        </property>
         <property name="maxConnections" value="10"/>   
    </bean> 
    
    <!-- 消息模板 -->
    <bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">  
        <property name="connectionFactory" ref="pooledConnectionFactory" />  
        <property name="defaultDestination" ref="queueDestination" />  
        <property name="messageConverter">  
            <bean class="org.springframework.jms.support.converter.SimpleMessageConverter" />
       </property>
         <!-- 消息转换器 -->  
<!--     	<property name="messageConverter" ref="emailMessageConverter"/> -->
    </bean>
    
      <!-- 配置消息目标 -->
    <bean id="queueDestination" class="org.apache.activemq.command.ActiveMQQueue">  
        <!-- 目标,在ActiveMQ管理员控制台创建 http://localhost:8161/admin/queues.jsp -->
        <constructor-arg index="0" value="helloQueue" />  
    </bean> 
    <!-- 用于测试消息回复的 -->  
	<bean id="responseQueue" class="org.apache.activemq.command.ActiveMQQueue">  
	    <constructor-arg>  
	        <value>responseQueue</value>  
	    </constructor-arg>  
	</bean>
	
    
    <!-- 通过实现MessageListenerAdapter接口实现消息监听 -->
    <bean id="jMSReceiver" class="com.hua.spring.jms.listener.JMSReceiver"></bean>
    <bean id="queueDestinationMessageListenerAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter">
        <constructor-arg ref="jMSReceiver"></constructor-arg>
    </bean>
  
  
     <!-- 消息监听容器 -->   
    <bean id="jMSReceiverQueueListenerAdapter" class=" org.springframework.jms.listener.DefaultMessageListenerContainer">  
          <property name="connectionFactory" ref="pooledConnectionFactory" />  
        <property name="destination" ref="queueDestination" />  
        <property name="messageListener" ref="queueDestinationMessageListenerAdapter" /> 
        <property name="concurrentConsumers" value="100"/>
         <property name="sessionTransacted" value="false"/> 
    </bean>
 
</beans>




版权声明:本文为博主原创文章,未经博主允许不得转载。

ActiveMQ入门教程(六) - ActiveMQ与Spring整合-MessageListener

在这一篇博客分享一下消费者,使用监听的实现方式。 1. pom.xml 和上一篇一样 : ActiveMQ入门教程(五) - ActiveMQ与Spring整合 2. 生产者 ...
  • jolingogo
  • jolingogo
  • 2013年10月14日 19:39
  • 4103

activeMQ集成SpringMVC,三种方式监听

  • 2017年07月28日 11:01
  • 5.33MB
  • 下载

ActiveMQ学习总结(10)——ActiveMQ采用Spring注解方式发送和监听

对于ActiveMQ消息的发送,原声的api操作繁琐,而且如果不进行二次封装,打开关闭会话以及各种创建操作也是够够的了。那么,Spring提供了一个很方便的去收发消息的框架,spring jms。整合...
  • u012562943
  • u012562943
  • 2016年11月01日 10:25
  • 4467

activemq 三种消息监听器

在Spring整合JMS的应用中我们在定义消息监听器的时候一共可以定义三种类型的消息监听器,分别是MessageListener、SessionAwareMessageListener和Message...
  • asdfsadfasdfsa
  • asdfsadfasdfsa
  • 2016年11月11日 15:28
  • 5448

activemq中对单独的监听器开启线程

public class SubApp implements MessageListener{ @Autowired ThreadPoolTaskExecutor threadPoolTask...
  • asdfsadfasdfsa
  • asdfsadfasdfsa
  • 2016年11月14日 10:09
  • 593

以SpringMVC框架为中心疯狂扩展-06、MessageListener实时监听ActiveMQ中的消息

1、在spring-activemq.xml中新加入listenerContainer和syxTopicDest等配置,实现消息监听容器,在connectionFactory中加入clientId。 ...
  • sunyx1130
  • sunyx1130
  • 2016年07月16日 11:20
  • 2717

Spring ActiveMQ整合+注解消息监听

对于ActiveMQ消息的发送,原生的api操作繁琐,而且如果不进行二次封装,打开关闭会话以及各种创建操作也是够够的了。而Spring提供了一个很方便的收发消息的框架,spring jms。整合Spr...
  • zhangweiwei2020
  • zhangweiwei2020
  • 2016年11月22日 16:02
  • 379

Spring整合activemq,实现单消费者消费

1.ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线,实现了JMS(Java MessageService,实际上是指JMS API)可用来实现基于消息的RPC(过程远程调用)...
  • ab7253957
  • ab7253957
  • 2016年07月15日 11:16
  • 1890

JMS与Spring之二(用message listener container异步收发消息)

本文主要参考Java Message Service(2nd)by Marc Ricbard。 在Spring框架中使用JMS传递消息有两种方式:JMS template和message liste...
  • moonsheep_liu
  • moonsheep_liu
  • 2011年08月13日 21:20
  • 41430

RabbitMQ消息队列+spring监听mq服务器,接收消费mq消息

最近soa项目要和官网系统对接,实现mq信息监听,保存等一些列操作。项目用的是Maven+SSM框架。然后学习和开发用了两天时间,算是搞定,趁加班时间做个总结。...
  • zhanglf02
  • zhanglf02
  • 2017年06月27日 09:03
  • 4792
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ActiveMQ与Spring整合:(3)消息监听器
举报原因:
原因补充:

(最多只允许输入30个字)