2017-08-08 25 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