【问题标题】:What's the Purpose of setting the clientID for JMS publisher / consumer?为 JMS 发布者/消费者设置 clientID 的目的是什么?
【发布时间】:2018-04-10 22:39:25
【问题描述】:

我了解在为我的持久主题编写 jms 主题订阅者时需要设置 clientId 和订阅名称。

但是在发布 TOPIC 时设置 clientID 的目的是什么?我见过有人为发布者/消费者设置客户端 ID,但没有人解释为什么需要它。

ConnectionFactory conFactory =  this.getConnectionFactory();
Connection connection = conFactory.createConnection();

connection.setClientID("WHATS_MY_PURPOSE"); // Why do we need clientID while publishing the TOPIC from consumer / publisher

connection.start();
MessageProducer producer = session.createProducer(destination);

【问题讨论】:

    标签: java jms activemq publish-subscribe


    【解决方案1】:

    需要clientId 来唯一标识应用程序。在 Pub/Sub 消息传递模式中使用持久订阅时必须这样做。您可能已经知道,消息传递提供程序会在它们处于脱机状态时缓存发往持久订阅者应用程序的发布。当此类应用程序再次上线时,消息传递提供者必须识别OK, this is the same application that created a durable subscription but went away for reason. Now it has come back. So let me deliver all messages that were published when this application was away。为了验证它是同一个应用程序,消息传递提供程序将应用程序的clientId 与缓存订阅信息的clientId 进行比较。

    【讨论】:

    • 您在这里指的是哪个应用程序?我认为的订阅者?毫无疑问,我们需要拥有 clientID 的订阅者。但这对出版商有多大意义?发布者拥有 clientID ?
    • 根据 JMS 1.1 规范,它是持久订阅者应用程序。由于 JMS 是 API 规范,因此某些消息传递提供程序也可能将其用于其他目的。不过我不认识任何人。
    • 好的,这是我的方案。 1. 发布者在 Queue 上发送消息并设置 clientID(比如 ABC) 2. 持久订阅者正在选择带有 clientID(比如 ABC)的消息 上面工作正常,没有任何问题。但即使我停止从发布者设置客户端 ID 并且只为订阅者设置客户端 ID,它也可以正常工作,例如;以下情况也可以正常工作,不会引起任何问题。 1. 发布者在没有设置 clientID 的情况下在 Queue 上发送消息 2. 持久订阅者正在选择带有 clientID 的消息(比如 ABC)
    • 正如我上面所说,发布者不需要设置clientId。持久订阅是必须的。
    • 我不会为用于发布和/或队列消费者的连接设置 ClientID。如果设置了 ClientID,则无法使用具有该 ID 的多个连接(来自多个节点、线程、进程等)。
    猜你喜欢
    • 1970-01-01
    • 2018-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-05
    • 1970-01-01
    • 2017-03-31
    • 2011-06-04
    相关资源
    最近更新 更多