【问题标题】:Stop AMQ MessageListenerAdapter on exception异常时停止 AMQ MessageListenerAdapter
【发布时间】:2014-12-27 05:38:38
【问题描述】:

我对 AMQ 还很陌生,我确实了解创建消息、将其发送到队列并异步使用它的概念。

我的主要 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 接收它们

我的问题:如果抛出异常,我需要侦听器停止消费消息。通常异常会告诉我远程站点离线并稍后再试。如果我不停止它,所有这些消息大部分都会丢失。想保持队列满,直到我能够再次发送。

有可能吗?

【问题讨论】:

    标签: java activemq


    【解决方案1】:

    如果您使用简单的 JMS 事务,您可以避免异常时消息丢失,而不必担心停止和启动您的侦听器。

    Here 很好地总结了如何确定您需要的确认类型。交易需要比您使用的自动确认更复杂的设置。您可以在答案here 中找到一个很好的非弹簧设置示例。

    【讨论】:

    • 我刚刚发现我在 auto-ack 上。尝试过 Session.CLIENT_ACKNOWLEDGE ,它说会将失败的消息保留在队列中,但它会卡在同一条消息上,直到交付为止,有什么想法吗?
    • 您需要设置重新配送政策。 activemq.apache.org/redelivery-policy.html CLIENT_ACKs 并不适用于所有情况,因为还有其他例外情况不会被处理。该文档很好地解释了每种模式默认提供的内容docs.spring.io/spring/docs/current/javadoc-api/org/…
    猜你喜欢
    • 2012-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2023-03-31
    相关资源
    最近更新 更多