JMS 2.0 долгосрочные подписки topi c лучшие практики в Кубернетес - PullRequest
0 голосов
/ 13 февраля 2020

Мы создаем приложение 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 

1 Ответ

2 голосов
/ 14 февраля 2020

В JMS 2.0 у вас нет для установки идентификатора клиента при создании общей долгосрочной подписки. Однако, если вы установите идентификатор клиента, он должен быть уникальным для каждого соединения. По любой причине (например, из-за Mule или, возможно, K8s) создается несколько соединений, и, поскольку каждое соединение использует один и тот же идентификатор клиента, вы получаете javax.jms.InvalidClientIDException.

Удалить clientId="${mq.client.id}" из вашей конфигурации и javax.jms.InvalidClientIDException должен go прочь.

...