在Spring中,構建監聽器 有三種方式:java
實現監聽器接口spring
適配器託管測試
註解監聽器this
其中,實現接口和註解監聽器 都須要一個監聽器容器的支持。
spa
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.net
而後初始化Spring便可,很是簡單code
若是使用同一個spring config,發送message的時候 spring-config已經被初始化了,這個時候已經有監聽器在工做了而無需再初始化化一次spring了component
ApplicationContext context = new ClassPathXmlApplicationContext("spring-config.xml");
無需實現接口,也無需註冊到spring的上下文中
xml
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中
blog
<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"/>