У меня есть потребительское приложение, которое использует Spring Boot JMS для прослушивания сообщений из очереди.Это приложение подключено к кластеру ActiveMQ с отказоустойчивостью, чтобы иметь HA.Но у меня возникает следующая проблема: когда я выключаю одного из посредников, и приложение обрабатывает одно сообщение, это сообщение не удаляется из очереди, а когда приложение подключается к другому посреднику, сообщение доставляется.Проблема в том, что сообщение было обработано в первый раз, и мне не нужно его обрабатывать снова.
Я искал режимы подтверждения и пытался использовать режим клиента для принудительного подтверждения перед обработкой сообщения.,Но я не работал.Любая идея ??
Я объявил следующие бины:
@Bean
public ActiveMQConnectionFactory jmsConnectionFactory() {
ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(brokerUrl);
connectionFactory.setUserName(brokerName);
connectionFactory.setPassword(brokerPassword);
connectionFactory.setTrustAllPackages(true);
return connectionFactory;
}
@Bean
public JmsTemplate jmsTemplate() {
JmsTemplate jmsTemplate = new JmsTemplate();
jmsTemplate.setConnectionFactory(jmsConnectionFactory());
jmsTemplate.setSessionTransacted(false);
jmsTemplate.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
jmsTemplate.setDefaultDestinationName(REMOTE_T);
return jmsTemplate;
}
@Bean
public JmsListenerContainerFactory<?> jmsListenerContainerFactory(
@Qualifier("jmsConnectionFactory") ConnectionFactory connectionFactory,
DefaultJmsListenerContainerFactoryConfigurer configurer) {
DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
factory.setSessionTransacted(false);
factory.setSessionAcknowledgeMode(Session.CLIENT_ACKNOWLEDGE);
configurer.configure(factory, connectionFactory);
return factory;
}
Код моего слушателя:
@JmsListener(destination = "Consumer.consumer1.VirtualTopic.TopicPrueba", containerFactory="jmsListenerContainerFactory")
public void receiveMessageFromContacts(Message message) {
try {
message.acknowledge();
TextMessage txtMessage = (TextMessage)message;
mensajesConsumer1++;
System.out.println("First Consumer:"+ txtMessage.getText()+ " received:"+mensajesConsumer1);
}catch(JMSException e) {
e.printStackTrace();
}
}
Я не уверен, что у меня естьправильно понял режим подтверждения клиента.
Пожалуйста, помогите!:)
Заранее спасибо!