Как поместить сообщение обратно в очередь, используя последние версии SpringBoot и ActiveMQ classic - PullRequest
0 голосов
/ 11 ноября 2019

Я проектирую простую систему, в которой поток будет примерно таким:

Message Producer Microservice --> Active MQ --> Message Consumer Microservice --> Mongo DB

Мне нужно спроектировать стратегию очередей таким образом, чтобы, если MongoDB не работал, Я не должен потерять сообщение (потому что потребитель сообщений удалит сообщение из очереди).

Мой потребитель написан так:

    @JmsListener(destination = "Consumer.myconsumer.VirtualTopic.Tracking")
    public void onReceiveFromQueueConsumer2(TrackingRequest trackingRequest) {
        log.debug("Received tracking request from the queue by consumer 2");
        log.debug(trackingRequest.toString());
    }

Как вы предоставляете подтверждение клиента?

Ответы [ 2 ]

0 голосов
/ 11 ноября 2019

Хорошо, поэтому я смог решить эту дилемму, вот как должен выглядеть ваш конфиг (спасибо Джастину за его ценный вклад):

    @Bean
    public ActiveMQConnectionFactory connectionFactory() {
        ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory();
        connectionFactory.setBrokerURL(brokerUrl);
        connectionFactory.setPassword(userName);
        connectionFactory.setUserName(password);
        connectionFactory.setTrustAllPackages(true);
        connectionFactory.setRedeliveryPolicy(redeliveryPolicy());
        return connectionFactory;
    }
    @Bean
    public JmsTemplate jmsTemplate() {
        JmsTemplate template = new JmsTemplate();
        template.setConnectionFactory(connectionFactory());
        return template;
    }
    @Bean
    public DefaultJmsListenerContainerFactory jmsListenerContainerFactory() {
        DefaultJmsListenerContainerFactory listenerCF = new DefaultJmsListenerContainerFactory();
        listenerCF.setConnectionFactory(connectionFactory());
        listenerCF.setSessionAcknowledgeMode(Session.AUTO_ACKNOWLEDGE);
        listenerCF.setSessionTransacted(true);
        return listenerCF;
    }
    @Bean
    public RedeliveryPolicy redeliveryPolicy() {
        RedeliveryPolicy redeliveryPolicy = new RedeliveryPolicy();
        redeliveryPolicy.setRedeliveryDelay(600000L); //keep trying every 10 minutes
        redeliveryPolicy.setMaximumRedeliveries(-1); //Keep trying till its successfully inserted
        return redeliveryPolicy;
    }
0 голосов
/ 11 ноября 2019

Вы можете использовать режим подтверждения клиента из вашей "Микросервисной службы сообщений". Поскольку вы используете Spring JmsListener, вы можете определить контейнер слушателя, используя containerFactory, а затем вы можете установить нужный режим для вашего контейнера слушателя, используя sessionAcknowledgeMode. См. документацию Spring для получения более подробной информации о том, какой режим подтверждения вы можете использовать здесь.

С точки зрения клиента ActiveMQ вы можете настроить семантику повторной доставки так, как вам нравится в случае сбоя. ,Подробнее об этом см. Документацию ActiveMQ .

...