在异常时停止AMQ MessageListenerAdapter

时间:2014-10-31 00:10:55

标签: java activemq

我对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

接收它们没有任何问题

我的问题:如果抛出异常,我需要监听器停止使用消息。通常异常将告诉我远程站点处于脱机状态并稍后再尝试。如果我不停止这些消息,那么这些消息大多都会丢失。想要保持队列满员,直到我能够再次发送。

有可能吗?

1 个答案:

答案 0 :(得分:0)

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

Here是关于如何决定所需确认类型的一个很好的总结。事务需要比您使用的auto-ack设置更复杂。您可以在答案here中找到一个很好的非弹簧示例来设置它。