java - JMS 订户客户端 ID 可以跨主机迁移吗?

标签 java jms

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

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

TopicConnection.setClientID("MyClient");

和:

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

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

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

但是,对于每个主机来说,同一个客户端 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

我认为主机身份以某种方式被合并到引擎盖下的客户端 ID 中是否正确?有没有办法阻止这种情况发生。

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

最佳答案

我对持久订阅者工作原理的理解(假设在第 8 步中所有内容都正确关闭。)与您的理解相同(这似乎是一个错误)。我从来没有看到任何迹象表明持久订阅(或与此相关的任何 jms 订阅)与特定主机相关联。这似乎会破坏任何构建健壮系统的尝试(即,如果原始主机崩溃,你就会被卡住)。

关于java - JMS 订户客户端 ID 可以跨主机迁移吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5302023/

相关文章:

java - 如何突出显示 TextView 中包含的部分文本?

java - 全局 channel 配置(租户/横幅/ Logo )

java - 使用 Jython 的标准 Python 模块的 ImportError(在 JAR 文件中)

session - ActiveMQ session 的AUTO_ACKNOWLEDGE属性影响

Azure ServiceBus JMS 事务支持尚不清楚

java - Java 中的嵌套泛型

java - 使用 tzupdater-2.2.0 更新 tzdata 2018f(2018-10-18 发布)时出错

java - ActiveMQ 不从队列中取出消息

filter - JMS 选择器与单独队列

scala - 将 Akka 流连接到 JMS