public class ListenerDemo implements MessageListener { public void onMessage(Message message) { System.out.println(message.toString()); } }
<!-- this is the Message Driven POJO (MDP) --> <bean id="messageListener1" class="spring.jms.ListenerDemo" />
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="cachingConnectionFactory"/> <property name="destination" ref="jmsDestination"/> <property name="messageListener" ref="messageListener1" /> </bean>
先送message 到queue里面 具体参考SpringFramework4系列之SpringJMS:(一)搭建JMS
然后初始化Spring即可,非常简单
如果使用同一个spring config,发送message的时候 spring-config已经被初始化了,这个时候已经有监听器在工作了而无需再初始化化一次spring了
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
无需实现接口,也无需注册到spring的上下文中
public class ListenerDemo2 { public void onMessage(Message message) { System.out.println(message.toString()); }
<bean id="messageAdapter" class="org.springframework.jms.listener.adapter.MessageListenerAdapter"> <constructor-arg> <bean class="spring.jms.ListenerDemo2"/> </constructor-arg> <property name="defaultListenerMethod" value="onMessage"/> </bean>
将适配器作为listener 配置到 container中
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="cachingConnectionFactory"/> <property name="destination" ref="jmsDestination"/> <property name="messageListener" ref="messageAdapter" /> </bean>
先送message 到queue里面 具体参考SpringFramework4系列之SpringJMS:(一)搭建JMS
然后初始化Spring即可,非常简单。
建议 发送message 和 监听器使用不同的spring config 来避免冲突。
如果使用同一个spring config,发送message的时候 spring-config已经被初始化了,这个时候已经有监听器在工作了而无需再初始化化一次spring了
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
使用注解@componet 来声明这个是个组件类
使用注解@JmsListener 来声明这是个监听器方法,其中 destination 表示 监听的队列名字,而containerFactory则表示使用的ListenerContainerFactory的。
@Component("listenerDemo3") public class ListenerDemo3 { @JmsListener(destination = "testQueue", containerFactory = "jmsListenerContainerFactory") public void receiveMessage(String message) { System.out.println("Received <" + message + ">"); } }
这个时候无需再定义监听器到监听器容器中啦。 这里笔者额外定义了属性 concurrency,表示同时会生成几个consumer。
具体的有spring 自动生成啦
<bean id="jmsContainer" class="org.springframework.jms.listener.DefaultMessageListenerContainer"> <property name="connectionFactory" ref="cachingConnectionFactory"/> <property name="destination" ref="jmsDestination"/> <property name="concurrency" value="3-10"/> </bean>
在spring 的config文件,需要定义jms 注解驱动,它会把注解的监听器类自动放到监听器容器中,是它开始工作。
<jms:annotation-driven/>
这里笔者做过一个实验,在没有配置component-scan,监听器也可以工作的。 看来这个注解驱动应该会自动扫描@componet的注解符号。
<context:component-scan base-package="spring"/>
SpringFramework4系列之SpringJMS:(四)异步接收消息 2.构建监听器
原文:http://my.oschina.net/u/1041012/blog/475834