ActiveMQ - 客户端已连接相同的 clientId 错误

Posted

技术标签:

【中文标题】ActiveMQ - 客户端已连接相同的 clientId 错误【英文标题】:ActiveMQ - client already connected with same clientId error 【发布时间】:2017-07-30 13:33:47 【问题描述】:

我们有一个连接到 ActivMQ apache-activemq-5.14.3 的 JBoss EAP 7.0.0.GA 设置。我们正在尝试使用以下配置设置持久订阅者:

@MessageDriven(
      name = "TestListener",
      activationConfig = 
        @ActivationConfigProperty(propertyName  = "destinationType",
                                      propertyValue = "javax.jms.Topic"),

        @ActivationConfigProperty(propertyName  = "subscriptionDurability",
                                      propertyValue = "Durable"),

        @ActivationConfigProperty(propertyName  = "subscriptionName",
              propertyValue = "subscriptionNameTest"),

        @ActivationConfigProperty(propertyName  = "clientId",
                                      propertyValue = "2"),

        @ActivationConfigProperty(propertyName  = "destination",
                                      propertyValue = "jms/testTopic")
      
)
@PermitAll
@ResourceAdapter(value="activemq-rar.rar")

但是,我们在 JBoss 服务器控制台中遇到以下异常

ERROR [org.apache.activemq.ra.ActiveMQEndpointWorker] (default-threads - 4) Failed to connect to broker [tcp://127.0.0.1:61616?jms.rmIdFromConnectionId=true]: Broker: TestBroker    - Client: 2 already connected from tcp://127.0.0.1:64246: javax.jms.InvalidClientIDException: Broker: TestBroker - Client: 2 already connected from tcp://127.0.0.1:64246

同时如果我们在 activmq 看到如下日志:

WARN  | Failed to add Connection ID: 40600-51:1 due to javax.jms.InvalidClientIDException: Broker: TestBroker - Client: 2 already connected from tcp://127.0.0.1:64246 | org.apache.activemq.broker.TransportConnection | ActiveMQ Transport: tcp:///127.0.0.1:50170@61616

ActiveMQManagedConnectionFactory 设置如下(尝试将max-pool-size设置为1,但没有效果):

/subsystem=resource-adapters/resource-adapter=activemq-rar.rar/connection-definitions=ConnectionFactory:add(class-name="org.apache.activemq.ra.ActiveMQManagedConnectionFactory", jndi-name="java:/MyConnectionFactory", enabled=true, min-pool-size=1, max-pool-size=20, pool-prefill=false, same-rm-override=false, recovery-username=ejb_user, recovery-password=xxxxx)

请向 AMQ 专家寻求帮助。

【问题讨论】:

【参考方案1】:

我能够让 AMQ 和 jboss 在没有一千个线程做愚蠢事情的情况下运行的唯一方法是使用嵌入式代理设置 RAR,然后将嵌入式代理与您的外部代理进行网络连接。

【讨论】:

我不明白你在说什么。你能提供更多细节吗? activemq rar文件设置的一部分是配置broker.xml文件。在此文件中,您可以启用嵌入式代理,该代理将通过网络连接到外部代理。参考activemq.apache.org/resource-adapter-properties.html【参考方案2】:

也许,更改您的属性/配置可以解决您的问题。 例如,尝试使用以下配置更改您的客户端 ID:

@ActivationConfigProperty(propertyName="clientId", propertyValue = "2-$jboss.node.name")

这将确保您的 clientId 是唯一的

【讨论】:

感谢 Yogesh,我们确实尝试了属性替换方式,动态设置 ClientId,遗憾的是没有喘息的机会。我们仍然得到同样的错误。我们只有单个节点设置,连接工厂池设置到 Max 1 连接仍然有多个线程尝试使用相同的 ClientId 进行连接。

以上是关于ActiveMQ - 客户端已连接相同的 clientId 错误的主要内容,如果未能解决你的问题,请参考以下文章

ActiveMq:超过允许的最大客户端连接数

Activemq - 超过允许的最大客户端连接数

各位,activemq可以限制客户端连接数吗

ActiveMQ JMS 主题 - 删除旧消息

activemq连接过多导致变慢

ActiveMQ配置ssl安全连接