持久订阅的@JmsListener问题

dev*_*per 2 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

根据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”目标) 。

要进行持久订阅,代码中是否需要进行任何更改?

Paw*_*tyl 7

您需要适当地配置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;
}
Run Code Online (Sandbox Code Playgroud)

这里有有趣的部分:

    factory.setSubscriptionDurable(true);
    factory.setClientId("jmsDemo");
Run Code Online (Sandbox Code Playgroud)

现在,当您输入ActiveMQ WebConsole时,您应该看到以下内容:

ActiveMQ WebConsole显示一个持久主题订阅者


dle*_*rob 5

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

factory.setPubSubDomain(true);
factory.setSubscriptionDurable(true);
factory.setClientId("jmsDemo");
Run Code Online (Sandbox Code Playgroud)

必须在之后

configurer.configure(factory, connectionFactory);
Run Code Online (Sandbox Code Playgroud)

否则您将丢失这些设置。