【问题标题】:Does the ClientID have to be unique within the same app in ArtemisClientID 在 Artemis 的同一个应用程序中是否必须是唯一的
【发布时间】:2020-12-05 16:27:06
【问题描述】:

这就是我所拥有的: 我们有 2 个应用程序,一个是生产的,一个是消费的。两者都在不同的 JVM 上运行。他们正在向持久主题发送消息并使用相同的 ClientId。

我想知道在 JMS 2.0 规范下是否允许以下​​操作,以及在 Artemis 中是否可以这样做。

  • 在消费端,我有一个连接工厂。
  • 我在实例化ActiveMQConnectionFactory bean时通过以下方法设置工厂的clientID:.setClientId("clientId").setEnabledSharedClientId(true)
  • 然后我有一个 A 类,它在其参数中采用 ActiveMQConnectionFactory 类型。在这个类中有一个 send 方法,它会检查连接是否存在,如果不存在,它会通过 this.connectionFactory.createConnection(); 创建连接。
  • 然后我有另一个类,其中包含A 对象类型。在这个类中有一个BlockingQueue 数组。在每个元素中,它包含一个ArrayBlockingQueue。本质上,这个类的目的是创建不同的线程来消费来自 ArrayBlockingQueue 的消息,因为消息被放在它们上面。每个线程都从它的 arrayblcokingqueue 中读取,它也在它自己的线程中分配。

现在我的问题是 JMS 2.0 规范允许这样做吗?可以在从 ONE/SAME connectionFactory 创建的不同线程上创建连接吗?每个线程都应该有自己的 ClientID 吗?

【问题讨论】:

  • 我的回答是否解决了您的问题?如果是这样,请将其标记为正确,以帮助将来可能有同样问题的其他人。如果没有,请详细说明缺少什么。谢谢!

标签: java jms activemq-artemis


【解决方案1】:

如 JMS 2 规范的第 2.14 节所述,javax.jms.ConnectionFactory 对象支持并发使用。因此,多个线程可以使用同一个ConnectionFactory 来创建javax.jms.Connection 的实例。

就客户端 ID 而言,这是规范第 6.1.2 节中的相关位:

根据定义,由客户端标识符标识的客户端状态只能由一个“正在使用” 一个客户。

...

JMS 定义的客户端标识符的唯一用途是强制使用它来标识非共享的持久订阅,或者可选地使用它来标识共享的持久或非持久订阅。

由于您的消费者似乎在共享某个主题的持久订阅,因此您对客户端 ID 的使用是可选

另外,值得注意的是,org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory#setEnableSharedClientID 实际上是一种内部方法,设计用于 JCA 资源适配器和涉及向后兼容性的某些情况。

【讨论】:

    猜你喜欢
    • 2018-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 2012-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多