2017-02-17 51 views
1

我使用Spring的@JmsListener(弹簧JMS-4.3.4.RELEASE.jar)使用下面的代码从ActiveMQ的接收消息:@JmsListener问题

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

按照春节API的文档(下面给出链接),上面的代码应该创建订购名称持久订阅作为xyz_topic_durable_subscription

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

但是,问题是,上面的代码创建的ly非耐用订阅我可以通过使用管理控制台监控ActiveMQ找到它(添加下面的屏幕快照,在'Active Non-Durable Topic Subscribers'部分查找'xyz.topic1'目的地)。

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

回答

3

你需要适当地配置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的Web控制台,你应该看到这一点:

ActiveMQ WebConsole showing one Durable Topic Subscriber

1

在答案中标出如上正确,代码:

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

必须跟从

configurer.configure(factory, connectionFactory); 

否则你将失去这些设置。