我有一个在JMS主题上有持久订阅者的任务,我需要能够将此任务从一个主机移动到另一个主机。
任务已使用以下方式设置其客户端ID:
TopicConnection.setClientID( “MyClient”);
和
TopicSession.createDurableSubscriber(主题, “耐用”);
对于TopicConnection,TopicSession和Topic的相关实例。我正在使用客户端确认,并且在成功处理后确认每条消息(我在下面发布的示例运行中没有错误。)
任务将始终具有相同的客户端ID(“MyClient”和“持久”组合)。
但是,对于每个主机,似乎将相同的客户端ID视为单独的。
所以我得到以下情况:
我是否正确地认为主机标识以某种方式被合并到引擎盖下的客户端ID中?有没有办法阻止这种情况发生。
我正在使用SwiftMQ,以防这种解决方案特有的行为。
答案 0 :(得分:1)
我对持久订阅者如何工作的理解(假设在步骤8中所有内容都正确关闭)与您的相同(这似乎是一个错误)。我从未见过任何表明持久订阅(或任何jms订阅)与特定主机绑定的内容。这似乎打破了构建一个强大系统的任何尝试(即如果原始主机崩溃,你就被卡住了。)
答案 1 :(得分:0)
好的,我们已经弄清楚为什么会这样。
我们群集中的每个服务器都维护着自己的JMS路由器。在SwiftMQ(如果不是所有JMS实现中),持久订阅是依赖于位置的。由于每个路由器都维护自己的持久订阅列表,因此即使它们具有相同的客户端ID,也会单独管理不同路由器上的两个持久订阅。