这就是我所拥有的:我们有两个应用程序,一个生产,一个消费。两者都在不同的JVM上运行。他们正在向持久主题发送消息,并且使用相同的ClientId。
我想知道在JMS 2.0规范下是否允许以下内容,以及在Artemis中是否可以这样做。
- 在消费端,我有一个连接工厂
- 在实例化ActiveMQConnectionFactory bean时,我通过以下方法在工厂上设置客户端ID:
.setClientId("clientId")
和.setEnabledSharedClientId(true)
- 然后我有一个类a,它在其params中采用
ActiveMQConnectionFactory
类型。在这个类中,有一个send方法,它在其中检查是否存在连接,如果不存在,则通过this.connectionFactory.createConnection();
创建连接 - 然后我有另一个类,它接受一个类型为
A
的对象。在这个类中有一个BlockingQueue
数组。在每个元素中,它包含一个ArrayBlockingQueue
。从本质上讲,这个类的目的是创建不同的线程,以便在将消息放入ArrayBlockingQueue时使用它们。每个线程都从它的arraylcongqueue中读取,它也在自己的线程中分配
现在我的问题是,JMS 2.0规范允许这样做吗?在从ONE/SAME connectionFactory创建的不同线程上创建连接可以吗?每个线程都应该有自己的ClientID吗?
如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资源适配器,并用于某些涉及向后兼容性的情况。