Spring ActiveMQ故障转移重新连接消息已回滚

Spring ActiveMQ故障转移重新连接消息已回滚,spring,jms,activemq,Spring,Jms,Activemq,我正试图找到一个问题的解决方案,以保证一条消息只被一个消费者完全过度处理 队列上有许多消息,许多使用者读取消息并将其写入数据库。我的消息是经过事务处理的,因此如果一个消费者死亡,那么该消息将返回队列,供另一个消费者处理 我们必须对activemq进行主动/被动配置,这就是问题的根源。如果我停止活动activemq,则当我使用故障转移传输时,使用者将重新连接到另一个activemq。这很好,但在重新连接过程中,消息会放回队列,而使用者不会意识到此重新连接并继续处理。这会导致两个使用者处理相同消息的

我正试图找到一个问题的解决方案,以保证一条消息只被一个消费者完全过度处理

队列上有许多消息,许多使用者读取消息并将其写入数据库。我的消息是经过事务处理的,因此如果一个消费者死亡,那么该消息将返回队列,供另一个消费者处理

我们必须对activemq进行主动/被动配置,这就是问题的根源。如果我停止活动activemq,则当我使用故障转移传输时,使用者将重新连接到另一个activemq。这很好,但在重新连接过程中,消息会放回队列,而使用者不会意识到此重新连接并继续处理。这会导致两个使用者处理相同消息的情况

我希望使用分布式事务管理器,这在将来可能会发生,但现在我需要一个不同的解决方案

如果我不使用故障转移传输,那么我可以挂接到JMSException侦听器并中止使用者。不幸的是,在使用故障转移传输时,这不起作用

我想对初始连接使用故障转移传输(发现哪个activemqs正在运行),然后强制故障转移不重新连接。。。或者使用不同的传输,允许服务器列表尝试但不重新连接。。。或者找个地方听音乐

请注意,有时只有一台服务器使用故障转移(重新连接)时会发生这种情况


我可以执行初始连接逻辑(查找活动服务器),但要检查是否有其他选项

您可以使用侦听器侦听ActiveMQConnection上的传输事件:

    connection = (ActiveMQConnection)factory.createConnection();
    connection.addTransportListener(new TransportListener() {
    public void onCommand(Object command) {
        // Do something 
    }

    public void onException(IOException error) {
        // Do something 
    }

    public void transportInterupted() {
        // Do something 
    }

    public void transportResumed() {
        // Do something 
    }
});
connection.start();

请注意,在本例中,侦听器直接设置在连接上;但是,您可以在ActiveMQConnectionFactory上设置一个实例,该实例将分配给它创建的每个连接实例

我突然想到,我可以使用discovery在Startup上获取有效连接。不幸的是,我没有连接句柄,因为我是通过DefaultMessageListenerContainer从PooledConnectionFactory获取连接的。请参阅编辑,您也可以在ActiveMQConnectionFactory上设置侦听器。PooledConnectionfactory不会公开它,这是spring boot提供给您的侦听器。我可以绕过这个问题,但我已经提前进行了测试,以获得有效的连接,然后侦听jms异常。