ActiveMQ Artemis ClientID не устанавливается - PullRequest
0 голосов
/ 24 января 2019

Мне трудно установить идентификатор клиента для моих потребителей в ActiveMQ Artemis.

Я использую Spring для создания ConnectionFactory и ContainerFactory, а затем использую его для установки ClientID.По какой-то причине он не отображается в консоли Artemis.

Вот код, определяющий фабричные bean-компоненты в моем классе конфигурации:

@Bean
public ConnectionFactory myConnectionFactory() {
    ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(host);
    connectionFactory.setUser(user);
    connectionFactory.setPassword(password);

    // I have tried setting it here
    connectionFactory.setClientID("myClient");
    connectionFactory.setGroupID("myClient");
    return connectionFactory;
}

@Bean
public DefaultJmsListenerContainerFactory myContainerFactory(@Qualifier("myConnectionFactory") ConnectionFactory connectionFactory,
                                 DefaultJmsListenerContainerFactoryConfigurer configurer) {
    DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setRecoveryInterval(10000);

    // I have tried setting it here
    factory.setClientId("myClient");
    configurer.configure(factory, connectionFactory);
    return factory;
}

А вот код, в котором я создаю связкупрослушивателей в соответствии с ListerEnum:

  for (ListersEnum listener : ListenersEnum.values()) {

        IListener handler = BeanUtil.getBean(listener.getHandler());
        DefaultJmsListenerContainerFactory containerFactory = BeanUtil.getBean<DefaultJmsListenerContainerFactory>(listener.getContainerFactory());

        SimpleJmsListenerEndpoint endpoint = new SimpleJmsListenerEndpoint();
        endpoint.setId(listener.getId());

        endpoint.destination = listener.getQueue();
        endpoint.setMessageListener(message -> handler.onReceive(message));

        DefaultMessageListenerContainer messageListenerContainer = containerFactory.createListenerContainer(endpoint);

        // I have tried setting it here also
        messageListenerContainer.setClientId("myClient");

        endpoint.setupListenerContainer(messageListenerContainer);

        jmsListenerEndpointRegistry.registerListenerContainer(endpoint, containerFactory);

        messageListenerContainer.start();
  }

А затем на консоли Artemis не установлен идентификатор клиента:

Artemis screenshot

Кроме того, я заметил, что Creation Time на консоли обновляется каждую секунду.Как будто соединение обновляется каждый раз.Это нормальное поведение?Это как-то связано с идентификатором клиента?

Мои зависимости:

springBootVersion = '1.5.15.RELEASE'

compile 'org.springframework.boot:spring-boot-starter-artemis'
compile 'org.apache.activemq:artemis-commons:1.4.0'
compile 'org.apache.activemq:artemis-core-client:1.4.0'
compile 'org.apache.activemq:artemis-jms-client:1.4.0'
compile 'org.apache.activemq:artemis-selector:1.4.0'

Любая помощь приветствуется

РЕДАКТИРОВАТЬ

Я изменил свой myContainerFactory на:

public DefaultJmsListenerContainerFactory myContainerFactory(@Qualifier("myConnectionFactory") ConnectionFactory connectionFactory,
                             DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
    factory.setRecoveryInterval(10000);

    // I have tried setting it here
    factory.setClientId("myClient");

    // Commented this so Spring wont set its default values
    // configurer.configure(factory, connectionFactory);

    factory.setConnectionFactory(connectionFactory);

    return factory;
}

Затем я начал получать

2019-01-24 17:50:28.612 ERROR 25504 --- [enerContainer-1] o.s.j.l.DefaultMessageListenerContainer  : Could not refresh JMS Connection for destination 'TEST_QUEUE' - retrying using FixedBackOff{interval=5000, currentAttempts=9, maxAttempts=unlimited}. Cause: Client id has already been set

Я попытался взломать его, сделав мой ClientID как "myClient" + new Date().getTime(), но получил то же самоерезультат.Странная часть заключается в том, что, если я вообще удаляю clientId, на консоли artemis я вижу только одно соединение ... Так как же он пытается создать другие с тем же идентификатором клиента?Есть идеи?

Редактировать 2

Я сделал пример вне Spring, чтобы посмотреть, будет ли это проблемой Spring ... Но это не так.Я получил те же результаты: идентификатор клиента не отображается на консоли, и если я установил его на Connection, я получаю ошибку Client ID already set.Это может быть что-то о моей консоли Артемиды ...?Я использую Apache ActiveMQ Artemis 2.6.2.Пожалуйста, помогите: s

Вот код, если кто-то захочет попробовать:

import javax.jms.*;

import org.apache.activemq.artemis.jms.client.ActiveMQConnectionFactory;

public class Consumer {

    public static void main(String[] args) throws JMSException {

        Connection connection = null;
        Session session = null;
        MessageConsumer consumer = null;
        ConnectionFactory factory = null;
        ActiveMQConnectionFactory artemisCf = null;

        try {
            artemisCf = new ActiveMQConnectionFactory("tcp://localhost:61616?retryInterval=1000reconnectAttempts=-1",
                    "user", "pass");
            artemisCf.setRetryInterval(1000);
            artemisCf.setReconnectAttempts(-1);
            artemisCf.setClientID("TESTE");

            factory = (ConnectionFactory) artemisCf;

            connection = factory.createConnection();

            // If I uncomment this I get the "Client id has already been set" error
            // connection.setClientID("TESTE");

            session = connection.createSession(true, 2);

            Queue queue = session.createQueue("QUEUE.TESTE.CONNCETION");

            consumer = session.createConsumer(queue);

            consumer.setMessageListener(new Listener("Me"));

            connection.start();

            Thread.sleep(2000000);

        } catch (Exception e) {
            System.out.println(e.getMessage());
        } finally {
            if (consumer != null && session != null && connection != null) {
                consumer.close();
                session.close();
                connection.close();
            }
        }
    }

    public static class Listener implements MessageListener {

        private String listenerName;

        public Listener(String consumerName) {
            this.listenerName = consumerName;
        }

        public void onMessage(Message message) {
            TextMessage textMessage = (TextMessage) message;
            try {
                System.out.println(listenerName + " received " + textMessage.getText());
            } catch (JMSException e) {
                e.printStackTrace();
            }
        }
    }
}
...