我试图找到问题的解决方案,以确保消息仅由单个消费者完全处理。
队列上的大量消息和许多消费者读取消息并处理它们写入数据库。我的消息被处理,以便在消费者死亡时消息返回队列以供另一个消费者处理。
我们必须为activemq配置主动/被动配置,这会导致问题。如果我停止活动的activemq,那么当我使用故障转移传输时,消费者会重新连接到另一个activemq。这很好但是在重新连接期间,消息被放回队列并且消费者不知道这种重新连接并继续处理。这导致2个消费者处理相同消息的情况。
我本来希望使用分布式事务管理器,这可能会在将来发生,但现在我需要一个不同的解决方案。
如果我不使用故障转移传输,那么我可以挂钩到JMSException侦听器并中止使用者。不幸的是,使用故障转移传输时这不起作用。
我想要使用故障转移传输进行初始连接(发现哪些activemq正在运行),然后强制故障转移不重新连接...或者使用允许服务器列表尝试但不执行的其他传输&# 39;重新连接...或者找不到来重新连接。
请注意,只有一台服务器使用故障转移(重新连接),有时会发生这种情况。
我可以完成初始连接逻辑(寻找活动服务器)但是要检查是否有其他选项
答案 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实例。