温馨提示:本文翻译自stackoverflow.com,查看原文请点击:其他 - JMS 2.0 durable subscriptions topic best practice in Kubernetes
activemq-artemis jms kubernetes mule amq

其他 - Kubernetes中的JMS 2.0持久订阅主题最佳实践

发布于 2020-05-02 23:59:00

我们正在创建一个Mule应用程序,该应用程序将在Kubernetes上的容器中运行,并且位于副本集中,该副本集中将连接到JMS 2.0 Red Hat AMQ 7(基于ActiveMQ Artemis)。

pom.xml已配置为获取jms客户端:

<dependency>
  <groupId>org.apache.activemq</groupId>
  <artifactId>artemis-jms-client-all</artifactId>
  <version>2.10.1</version>
</dependency>

并且JMS配置配置为:

<jms:config name="JMS_Config" doc:name="JMS Config" doc:id="8621b07d-b203-463e-bbbe-76eb03741a61" >
    <jms:generic-connection specification="JMS_2_0" username="${mq.user}" password="${mq.password}" clientId="${mq.client.id}">
        <reconnection >
            <reconnect-forever frequency="${mq.reconnection.frequency}" />
        </reconnection>
        <jms:connection-factory >
            <jms:jndi-connection-factory connectionFactoryJndiName="ConnectionFactory" >
                <jms:name-resolver-builder jndiInitialContextFactory="org.apache.activemq.artemis.jndi.ActiveMQInitialContextFactory" jndiProviderUrl="${mq.brokerurl}"/>
            </jms:jndi-connection-factory>
        </jms:connection-factory>
    </jms:generic-connection>
    <jms:consumer-config>
        <jms:consumer-type >
            <jms:topic-consumer shared="true" durable="true"/>
        </jms:consumer-type>
    </jms:consumer-config>
    <jms:producer-config persistentDelivery="true"/>
</jms:config>

然后在JMS侦听器组件中:

<jms:listener doc:name="EMS JMS Listener" doc:id="318b4f08-daf6-41f4-944b-3ec1420d5c12" config-ref="JMS_Config" destination="${mq.incoming.queue}" ackMode="AUTO" >
    <jms:consumer-type >
        <jms:topic-consumer shared="true" subscriptionName="${mq.sub.name}" durable="true"/>
    </jms:consumer-type>
    <jms:response sendCorrelationId="ALWAYS" />
</jms:listener>

变量设置为:

mq.client.id=client-id-135a9514-d4d5-4f52-b01c-f6ca34a76b40
mq.sub.name=my-sub
mq.incoming.queue=my-queue

这是配置客户端的最佳方法吗?正如我们已经看到的那样,当部署到K8时,日志中会出现与AMQ服务器连接的错误:

javax.jms.InvalidClientIDException: client-id-135a9514-d4d5-4f52-b01c-f6ca34a76b40 was already set into another connection 

查看更多

提问者
Steve
被浏览
59
Justin Bertram 2020-02-14 10:57

在JMS 2.0你不具备创建共享持久订阅时设置客户端标识符。但是,如果您确实设置了客户端标识符,则每个连接必须唯一。无论出于何种原因(例如由于Mule或K8),都会创建多个连接,并且由于每个连接都使用相同的客户端标识符,因此您会收到javax.jms.InvalidClientIDException

clientId="${mq.client.id}"从您的配置中删除javax.jms.InvalidClientIDException应该消失。