SpringFramework4系列之SpringJMS:(四)异步接收消息 2.构建监听器

在Spring中,构建监听器 有三种方式:

  1. 实现监听器接口

  2. 适配器托管

  3. 注解监听器

其中,实现接口和注解监听器 都需要一个监听器容器的支持。

构建实现接口的监听器

编写监听器类并且实现监听器接口

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

然后初始化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>

配置listenerContainerFactory

将适配器作为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 + ">");
    }
}

配置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"/>


你可能感兴趣的:(SpringFramework4系列之SpringJMS:(四)异步接收消息 2.构建监听器)