Java 异常时停止AMQ MessageListenerAdapter

Java 异常时停止AMQ MessageListenerAdapter,java,activemq,Java,Activemq,我对AMQ相当陌生,我确实理解生成消息、将消息发送到队列并异步使用消息的概念 我的主要弹簧配置如下 @Bean public DefaultMessageListenerContainer listenerContainer( MessageListenerAdapter adapter) { DefaultMessageListenerContainer dmlc = new DefaultMessageListenerContainer();

我对AMQ相当陌生,我确实理解生成消息、将消息发送到队列并异步使用消息的概念

我的主要弹簧配置如下

@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接收它们,我没有任何问题

我的问题:如果引发异常,我需要侦听器停止使用消息。通常,异常会告诉我远程站点处于脱机状态,请稍后再试。如果我不停止,所有的信息都会丢失。希望在我能够再次发送之前保持队列已满


有可能吗?

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


这是一个关于如何决定您需要的确认类型的很好的总结。事务需要比您正在使用的自动确认更复杂的设置。您可以在答案中找到一个很好的非spring示例

我刚发现我刚才在自动确认上。尝试了Session.CLIENT_ACKNOWLEDGE,它表示会将失败的邮件保留在队列中,但它会在发送之前一直停留在同一邮件上,有什么想法吗?您需要设置重新发送策略。客户机确认并不适用于所有情况,但也有其他例外情况不会处理。本文档很好地解释了每种模式默认提供的功能