是否可以跨主机迁移JMS订户客户端ID?

时间:2011-03-14 17:18:37

标签: java jms

我有一个在JMS主题上有持久订阅者的任务,我需要能够将此任务从一个主机移动到另一个主机。

任务已使用以下方式设置其客户端ID:

TopicConnection.setClientID( “MyClient”);

TopicSession.createDurableSubscriber(主题,                 “耐用”);

对于TopicConnection,TopicSession和Topic的相关实例。我正在使用客户端确认,并且在成功处理后确认每条消息(我在下面发布的示例运行中没有错误。)

任务将始终具有相同的客户端ID(“MyClient”和“持久”组合)。

但是,对于每个主机,似乎将相同的客户端ID视为单独的。

所以我得到以下情况:

  1. 主机A正在运行订阅者。
  2. 发送消息1-10。
  3. 主机A接收消息1-10并关闭其订户(关闭连接)
  4. 发送消息11-20。
  5. 主机B设置(显然)具有相同客户端ID的订户
  6. 发送消息21-30。
  7. 主机B收到消息11-30(通常是几条先前的消息,似乎是随机的)
  8. 主机B将其用户关闭
  9. 主机A再次设置其订户
  10. 主机A接收消息11-30
  11. 我是否正确地认为主机标识以某种方式被合并到引擎盖下的客户端ID中?有没有办法阻止这种情况发生。

    我正在使用SwiftMQ,以防这种解决方案特有的行为。

2 个答案:

答案 0 :(得分:1)

我对持久订阅者如何工作的理解(假设在步骤8中所有内容都正确关闭)与您的相同(这似乎是一个错误)。我从未见过任何表明持久订阅(或任何jms订阅)与特定主机绑定的内容。这似乎打破了构建一个强大系统的任何尝试(即如果原始主机崩溃,你就被卡住了。)

答案 1 :(得分:0)

好的,我们已经弄清楚为什么会这样。

我们群集中的每个服务器都维护着自己的JMS路由器。在SwiftMQ(如果不是所有JMS实现中),持久订阅是依赖于位置的。由于每个路由器都维护自己的持久订阅列表,因此即使它们具有相同的客户端ID,也会单独管理不同路由器上的两个持久订阅。