Kubernetes 中的 JMS 2.0 持久订阅主题最佳实践
JMS 2.0 durable subscriptions topic best practice in Kubernetes
我们正在创建一个 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
这是配置客户端的最佳方式吗?正如我们在部署到 K8s 时在日志中看到的关于与 AMQ 服务器的连接的错误:
javax.jms.InvalidClientIDException: client-id-135a9514-d4d5-4f52-b01c-f6ca34a76b40 was already set into another connection
在 JMS 2.0 中,您没有在创建共享持久订阅时设置客户端标识符。但是,如果您确实设置了客户端标识符,那么每个连接它必须是唯一的。无论出于何种原因(例如,由于 Mule 或 K8s)正在创建多个连接,并且由于每个连接都使用相同的客户端标识符,您将收到 javax.jms.InvalidClientIDException
.
从您的配置中删除 clientId="${mq.client.id}"
,javax.jms.InvalidClientIDException
应该会消失。
我们正在创建一个 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
这是配置客户端的最佳方式吗?正如我们在部署到 K8s 时在日志中看到的关于与 AMQ 服务器的连接的错误:
javax.jms.InvalidClientIDException: client-id-135a9514-d4d5-4f52-b01c-f6ca34a76b40 was already set into another connection
在 JMS 2.0 中,您没有在创建共享持久订阅时设置客户端标识符。但是,如果您确实设置了客户端标识符,那么每个连接它必须是唯一的。无论出于何种原因(例如,由于 Mule 或 K8s)正在创建多个连接,并且由于每个连接都使用相同的客户端标识符,您将收到 javax.jms.InvalidClientIDException
.
从您的配置中删除 clientId="${mq.client.id}"
,javax.jms.InvalidClientIDException
应该会消失。