Spring Boot JMS ActiveMQ Redeliver при отработке отказа - PullRequest
0 голосов
/ 20 ноября 2018

У меня есть потребительское приложение, которое использует 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();
        }
    }

Я не уверен, что у меня естьправильно понял режим подтверждения клиента.

Пожалуйста, помогите!:)

Заранее спасибо!

...