我使用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
:
但是,问题是上面的代码只会创建非持久订阅,我可以通过使用管理控制台监控ActiveMQ找到它(在下面添加了截图,查找' xyz.topic1& #39;“有效非持久主题订阅者”下的目标位置。
代码中是否有任何更改才能进行持久订阅?
答案 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时,您应该看到:
答案 1 :(得分:3)
在上面标记为正确的答案中,代码为:
factory.setPubSubDomain(true);
factory.setSubscriptionDurable(true);
factory.setClientId("jmsDemo");
必须在
之后configurer.configure(factory, connectionFactory);
或者您将丢失这些设置。
答案 2 :(得分:1)
您还需要配置侦听器容器工厂以为durable subscriptions创建容器。