2014-10-31 56 views
0

我對AMQ相當陌生,但我理解制作消息,將其發送到隊列以及異步使用它的概念。停止對異常的AMQ MessageListenerAdapter

我的主要Spring的配置文件有以下幾種

@Bean 
    public DefaultMessageListenerContainer listenerContainer(
      MessageListenerAdapter adapter) { 
     DefaultMessageListenerContainer dmlc = new DefaultMessageListenerContainer(); 
     dmlc.setConnectionFactory(connectionFactory()); 
     dmlc.setMessageListener(adapter); 
     dmlc.setDestinationName("myQueue"); 
     dmlc.setConcurrentConsumers(5); 
     return dmlc; 
    } 

@Bean 
MessageListenerAdapter adapter(MyClass myClass) { 
    MessageListenerAdapter messageListener = new MessageListenerAdapter(
      myClass); 
    messageListener.setDefaultListenerMethod("myMethod"); 
    return messageListener; 
} 

@Bean 
public JmsTemplate jmsTemplate() { 
    JmsTemplate jt = new JmsTemplate(connectionFactory()); 
    return jt; 
} 

我有麻煩的事情發送到隊列jmsTemplate.convertAndSend(),然後用myClass的#myMethod的

我的問題 recieving他們:如果發生異常,我需要偵聽器停止使用消息。通常情況下,例外會告訴我遠程站點處於脫機狀態,稍後再嘗試。如果我不阻止它,那麼所有這些信息都會丟失。想保持隊列滿,直到我能夠再次發送。

可能嗎?

回答

0

如果您使用簡單的JMS事務,您可以避免在異常時丟失消息,而無需擔心停止和啓動偵聽器。

Here是如何決定您需要的確認類型的好摘要。交易需要比您使用的自動確認更復雜的設置。你可以在答案here中找到一個很好的非彈性示例。

+0

我剛剛發現我以前在auto-ack。試過Session.CLIENT_ACKNOWLEDGE,它表示會將失敗的消息保存在隊列中,但它會一直停留在相同的消息上,直到被傳遞,而不是任何想法? – javaNoober 2014-10-31 19:37:02

+0

您需要設置重送策略。 http://activemq.apache.org/redelivery-policy.html CLIENT_ACKs不適用於所有情況,但有其他例外,它不會被處理。本文檔對每種模式默認提供的內容都有很好的解釋http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jms/listener/AbstractMessageListenerContainer.html – 2014-10-31 19:51:31