我有一个任务,它有一个 JMS 主题的持久订阅者,我需要能够将这个任务从一个主机移动到另一个主机。
任务已使用以下方式设置其客户端 ID:
TopicConnection.setClientID("MyClient");
和:
TopicSession.createDurableSubscriber(主题, “耐用”);
对于TopicConnection、TopicSession和Topic的相关实例。我正在使用客户端确认,每条消息在成功处理后都会得到确认(我在下面发布的示例运行中没有错误)。
任务将始终具有相同的客户端 ID(“MyClient”和“durable”的组合)。
但是,对于每个主机来说,同一个客户端 ID 似乎是分开的。
所以我得到以下场景:
- 主机 A 正在运行订阅者。
- 消息 1-10 已发送。
- 主机 A 收到消息 1-10 并关闭它的订阅者(关闭连接)
- 消息 11-20 已发送。
- 主机 B 使用(显然)相同的客户端 ID 设置订阅者
- 消息 21-30 已发送。
- 主机 B 收到消息 11-30(通常是一些之前的消息,看似随机)
- 主机 B 关闭其订阅者
- 主机 A 再次设置它的订阅者
- 主机 A 收到消息 11-30
我认为主机身份以某种方式被合并到引擎盖下的客户端 ID 中是否正确?有没有办法阻止这种情况发生。
我正在使用 SwiftMQ,以防这是该解决方案特有的行为。
最佳答案
我对持久订阅者工作原理的理解(假设在第 8 步中所有内容都正确关闭。)与您的理解相同(这似乎是一个错误)。我从来没有看到任何迹象表明持久订阅(或与此相关的任何 jms 订阅)与特定主机相关联。这似乎会破坏任何构建健壮系统的尝试(即,如果原始主机崩溃,你就会被卡住)。
关于java - JMS 订户客户端 ID 可以跨主机迁移吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5302023/