SpringFramework4系列之SpringJMS:(四)異步接收消息 2.構建監聽器

在Spring中,構建監聽器 有三種方式:java

  1. 實現監聽器接口spring

  2. 適配器託管測試

  3. 註解監聽器this

其中,實現接口和註解監聽器 都須要一個監聽器容器的支持。
spa

構建實現接口的監聽器

編寫監聽器類而且實現監聽器接口

public class ListenerDemo implements MessageListener {
    public void onMessage(Message message) {
        System.out.println(message.toString());
    }
}

註冊MDP

<!-- this is the Message Driven POJO (MDP) -->
<bean id="messageListener1" class="spring.jms.ListenerDemo" />

配置listenerContainerFactory

<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>

配置listenerContainerFactory

將適配器做爲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 + ">");
    }
}

配置listenerContainerFactory

這個時候無需再定義監聽器到監聽器容器中啦。 這裏筆者額外定義了屬性 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>

配置JMS 驅動

在spring 的config文件,須要定義jms 註解驅動,它會把註解的監聽器類自動放到監聽器容器中,使它開始工做。

<jms:annotation-driven/>

這裏筆者作過一個實驗,在沒有配置component-scan,監聽器也能夠工做的。 看來這個註解驅動應該會自動掃描@componet的註解符號。

<context:component-scan base-package="spring"/>
相關文章
相關標籤/搜索