2017-08-08 28 views
2

我需要为ActiveMQ创建一个主题和一个持久订阅者,我的问题是我不知道在哪里指定。我可以创建主题并使用消息,但是当我关闭订阅者时,请继续发送消息并再次打开订阅者,它不会读取它们。用ActiveMQ创建持久的主题和用户弹簧引导jms

这是我到目前为止有:

发送消息:

JmsTemplate jmsTemplate = context.getBean(JmsTemplate.class); 
    jmsTemplate.setPubSubDomain(true); 
    jmsTemplate.setDeliveryMode(DeliveryMode.PERSISTENT); 
    jmsTemplate.setDeliveryPersistent(true); 
    jmsTemplate.convertAndSend("venta.topic",venta); 

收到消息:

@JmsListener(destination = "venta.topic",id = "comercial",subscription = "venta.topic") 
public void receiveMessage(Venta venta) { 
    logger.log(Level.INFO, "RECEIVED : {0}",venta);  
    repository.save(venta); 
} 

我已阅读this article,我明白,我需要创建持久的用户。

我也看到了spring docs

而且我觉得它有什么做的DefaultJmsListenerContainerFactory(我没有实现,我使用的是默认配置),该文档显示:

@Bean 
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() { 
    DefaultJmsListenerContainerFactory factory = 
      new DefaultJmsListenerContainerFactory(); 
    factory.setConnectionFactory(connectionFactory()); 
    factory.setDestinationResolver(destinationResolver()); 
    factory.setConcurrency("3-10"); 
    return factory; 
} 

但我似乎无法找到在哪里创建持久会话。我的制作人和用户都连接到独立的activemq二进制文件。

我希望你能帮助我,在此先感谢。

回答

3

由于以前的答案指出,有必要设置客户端ID,并在工厂的持久订阅:

@Bean 
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() { 
    DefaultJmsListenerContainerFactory factory = 
      new DefaultJmsListenerContainerFactory(); 
    factory.setConnectionFactory(connectionFactory()); 
    factory.setDestinationResolver(destinationResolver()); 
    factory.setConcurrency("3-10"); 
    factory.setClientID("brokerClientId"); 
    factory.setSubscriptionDurable(true); 
    return factory; 
} 

但不能单独注册客户作为长期订户,那是因为JMSListener需要containerFactory规定,否则就只是采用默认值:

@JmsListener(
destination = "venta.topic", 
id = "comercial", 
subscription = "venta.topic", 
//this was also needed with the same name as the bean above 
containerFactory = "jmsListenerContainerFactory" 
) 
public void receiveMessage(Venta venta) { 
      logger.log(Level.INFO, "RECEIVED : {0}",venta);  
      repository.save(venta); 
} 

值得一提的是,this post是让我意识到自己错误的原因之一。

我希望这会帮助别人

1

很难说清楚,但这个问题的一个常见原因是忘记在connectionFactory bean上配置唯一的clientId。它必须是独一无二的,并且是经纪人可以告诉每个客户分开的方式。

+1

感谢您的指点我朝着正确的方向 –

3

DefaultJmsListenerContainerFactory应该有唯一的clientId和持久子。真正的集类似下面的代码:

@Bean 
public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() { 
    DefaultJmsListenerContainerFactory factory = 
      new DefaultJmsListenerContainerFactory(); 
    factory.setConnectionFactory(connectionFactory()); 
    factory.setDestinationResolver(destinationResolver()); 
    factory.setConcurrency("3-10"); 
    factory.setClientID("brokerClientId"); 
    factory.setSubscriptionDurable(true); 
    return factory; 
} 
+1

谢谢你指着我的方向是正确的,但我还是有这个问题,看起来像我需要注册工厂在JMSListener –

+0

正确,您需要在JmsListener中注册自定义containerFactory。 – Nir