Мне трудно установить идентификатор клиента для моих потребителей в 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 не установлен идентификатор клиента:
Кроме того, я заметил, что 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();
}
}
}
}