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

我正在设计一个简单的系统,流程将像这样:

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());
    }

您如何提供客户确认?

hliyouheng 回答:如何使用最新的SpringBoot和ActiveMQ classic将消息放回队列

您可以从“消息使用者微服务”中使用客户端确认模式。由于您使用的是Spring JmsListener,因此可以使用containerFactory定义侦听器容器,然后可以使用sessionAcknowledgeMode在侦听器容器上设置所需的模式。有关您可能想在此处使用哪种确认模式的更多详细信息,请参见the Spring documentation

从ActiveMQ客户端的角度来看,您可以配置重新交付语义,但是如果发生故障,可以根据需要进行配置。有关更多信息,请参见ActiveMQ documentation

,

好的,所以我能够解决这个难题,这就是您的配置应该是什么样的(感谢贾斯汀的宝贵意见):

    @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;
    }
本文链接:https://www.f2er.com/3127198.html

大家都在问