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