持久订阅的@JmsListener问题

时间:2017-02-17 14:56:45

标签: java spring jms spring-jms

我使用Spring的@JmsListener(spring-jms-4.3.4.RELEASE.jar)使用以下代码从ActiveMQ接收消息:

@Component
public class TopicSubscriber {
    @JmsListener(destination="xyz.topic1", subscription="xyz_topic_durable_subscription")
    public void send(Product product) {     
        System.out.println(" reveived message ***"+product);
    }
}

根据Spring API的文档(下面给出的链接),上面的代码应创建一个持久订阅,订阅名称为xyz_topic_durable_subscription

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/annotation/JmsListener.html#subscription--

但是,问题是上面的代码只会创建非持久订阅,我可以通过使用管理控制台监控ActiveMQ找到它(在下面添加了截图,查找' xyz.topic1& #39;“有效非持久主题订阅者”下的目标位置。

代码中是否有任何更改才能进行持久订阅?

3 个答案:

答案 0 :(得分:5)

您需要适当地配置ListenerContainerFactory:

@Bean
public JmsListenerContainerFactory<?> myFactory(ConnectionFactory connectionFactory,
                                                DefaultJmsListenerContainerFactoryConfigurer configurer) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setPubSubDomain(true);
    factory.setSubscriptionDurable(true);
    factory.setClientId("jmsDemo");
    // This provides all boot's default to this factory, including the message converter
    configurer.configure(factory, connectionFactory);
    // You could still override some of Boot's default if necessary.
    return factory;
}

有趣的部分在这里:

    factory.setSubscriptionDurable(true);
    factory.setClientId("jmsDemo");

现在,当您进入ActiveMQ WebConsole时,您应该看到:

ActiveMQ WebConsole showing one Durable Topic Subscriber

答案 1 :(得分:3)

在上面标记为正确的答案中,代码为:

factory.setPubSubDomain(true);
factory.setSubscriptionDurable(true);
factory.setClientId("jmsDemo");

必须在

之后
configurer.configure(factory, connectionFactory);

或者您将丢失这些设置。

答案 2 :(得分:1)

您还需要配置侦听器容器工厂以为durable subscriptions创建容器。