生产者可以使用相同的clientId并发布到Artemis中的主题吗?

问题描述

我想知道是否可能有多个生产者使用相同的clientId将消息发送给持久主题。在消费方,如果clientID与生产方相同但订阅名称不同,会发生什么情况?

例如生产者的clientId为123abc,并将消息发送到持久主题。使用者订阅了该持久性主题,并且该使用者的clientId为123abc,还具有subscriptionName为abc123?消费者仍然可以接听消息吗?如果我将另一个消费者加入其中,会发生什么?

解决方法

两个订户不能具有相同的clientid:当他们两个都尝试连接到代理时,第二个订户将进入异常。但是,您可以覆盖clientid:使用TomEE或Tomcat可以向system.properties文件中添加一条简单的行,如下所示:

<classname>.activation.clientId=<newclientid>

生产者没问题。

,

JMS 2规范的6.1.2节指出:

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

通过“客户端”,规范实际上意味着“连接”。因此,同一客户端标识符一次只能由一个连接使用。因此,如果您从同一连接创建多个生产者,那就没问题。但是,使用同一客户端ID创建多个连接将失败,甚至无法创建生产者,因为代理将在创建连接时验证客户端ID。

也就是说,在仅用于产生消息的连接上设置客户端ID毫无意义。 JMS 2规范的6.1.2节还规定:

JMS定义的客户端标识符的唯一用途是其在标识未共享的持久预订中的强制性使用,或在标识共享的持久或非持久预订中的可选用途。

因此,除非您要创建非共享的持久订阅或可能的共享持久或非持久订阅,否则实际上没有必要设置客户端ID。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...