Spring boot 如何使用最新的SpringBoot和ActiveMQ classic将消息放回队列

Spring boot 如何使用最新的SpringBoot和ActiveMQ classic将消息放回队列,spring-boot,error-handling,activemq,Spring Boot,Error Handling,Activemq,我正在设计一个简单的系统,流程如下: @JmsListener(destination = "Consumer.myconsumer.VirtualTopic.Tracking") public void onReceiveFromQueueConsumer2(TrackingRequest trackingRequest) { log.debug("Received tracking request from the queue by consumer 2");

我正在设计一个简单的系统,流程如下:

    @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());
    }
消息生产者微服务-->活动MQ-->消息消费者微服务-->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());
    }

如何提供客户端确认?

您可以从“Message Consumer Microservice”使用客户端确认模式。由于您使用的是Spring
JmsListener
,因此您可以使用定义侦听器容器,然后可以使用
sessionAcknowledgeMode在侦听器容器上设置所需的模式。请参阅以获取有关您可能希望在此处使用的ack模式的更多详细信息


从ActiveMQ客户机的角度来看,在出现故障时,您可以随意配置重新交付语义。有关这方面的更多信息,请参阅。

好的,我解决了这个难题,下面是您的配置应该是什么样子(感谢Justin的宝贵输入):


@贾斯汀·伯特伦:为了更清楚,我更新了这个问题。问题是,如果MongoDB关闭,我们如何在几个小时后处理相同的消息?您好,我编辑了这个问题,以了解如果我的消费者使用@JMSListener编写,如何获得客户确认。谢谢。我更新了我的答案,以解决您问题中的变化。希望有帮助!我的回答回答了你的问题吗?如果是这样,请将其标记为这样,以帮助将来可能有相同问题的其他人。谢谢
    @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;
    }