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

时间:2014-09-04 09:35:20

标签: spring jms activemq

我试图找到问题的解决方案,以确保消息仅由单个消费者完全处理。

队列上的大量消息和许多消费者读取消息并处理它们写入数据库。我的消息被处理,以便在消费者死亡时消息返回队列以供另一个消费者处理。

我们必须为activemq配置主动/被动配置,这会导致问题。如果我停止活动的activemq,那么当我使用故障转移传输时,消费者会重新连接到另一个activemq。这很好但是在重新连接期间,消息被放回队列并且消费者不知道这种重新连接并继续处理。这导致2个消费者处理相同消息的情况。

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

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

我想要使用故障转移传输进行初始连接(发现哪些activemq正在运行),然后强制故障转移不重新连接...或者使用允许服务器列表尝试但不执行的其他传输&# 39;重新连接...或者找不到来重新连接。

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

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

1 个答案:

答案 0 :(得分:0)

您可以使用侦听器侦听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();

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