Spring boot SpringBootJMS:如何在JMS接收器发生内部应用程序错误时不丢失JMS消息

Spring boot SpringBootJMS:如何在JMS接收器发生内部应用程序错误时不丢失JMS消息,spring-boot,jms,message-queue,spring-jms,Spring Boot,Jms,Message Queue,Spring Jms,若JMS接收器由于数据库连接失败等原因而失败,那个么JMS消息将丢失。有人能告诉我什么是使用spring boot应用程序避免丢失JMS消息的常见解决方案吗 在接收端处理消息时,如果出现错误,我是否应该将消息重新发送回它发源的队列 这是我的场景源代码 @springboot应用程序 公共类MainApp{ 公共静态void main(字符串[]args){ SpringApplication.run(MainApp.class,args); } @豆子 公共JmsListenerContaine

若JMS接收器由于数据库连接失败等原因而失败,那个么JMS消息将丢失。有人能告诉我什么是使用spring boot应用程序避免丢失JMS消息的常见解决方案吗

在接收端处理消息时,如果出现错误,我是否应该将消息重新发送回它发源的队列

这是我的场景源代码

@springboot应用程序
公共类MainApp{
公共静态void main(字符串[]args){
SpringApplication.run(MainApp.class,args);
}
@豆子
公共JmsListenerContainerFactory SDB工厂(连接工厂连接工厂,
DefaultJmsListenerContainerFactoryConfigurer(配置器){
DefaultJmsListenerContainerFactory=新的DefaultJmsListenerContainerFactory();
//这为该工厂提供了所有引导的默认设置,包括消息转换器
configurer.configure(工厂、连接工厂);
//如有必要,您仍然可以覆盖Boot的一些默认设置。
返回工厂;
}
@豆子
公共队列(){
返回新的ActiveMQQueue(“sdb.orderQueue”);
}
@豆子
公共消息转换器jacksonJmsMessageConverter(){
MappingJackson2MessageConverter=新的MappingJackson2MessageConverter();
setTargetType(MessageType.TEXT);
converter.setTypeIdPropertyName(“_-type”);
回流转换器;
}
@豆子
公共模型映射器映射器(){
ModelMapper mapper=新的ModelMapper();
setMatchingStrategy(MatchingStrategies.STRICT);
返回映射器;
}
}
制作人

@RestController
@请求映射(“/transaction”)
公共类OrderTransactionController{
@自动连线
私有JMSMessageTemplate JMSMessageTemplate;
专用静态最终记录器=
getLogger(OrderTransactionController.class);
@后映射(“/send”)
公共无效发送(@RequestBody OrderDTO order){
LOGGER.info(“发送交易。”+订单);
jmsMessagingTemplate.convertAndSend(“sdb.orderQueue”,order);
}
}
消费者

@组件
公共类OrderMessageReceiver{
@自动连线
订单服务;
@自动连线
模型映射器模型映射器;
@自动连线
私有JMSMessageTemplate JMSMessageTemplate;
专用静态最终记录器=
getLogger(OrderMessageReceiver.class);
@JmsListener(destination=“sdb.orderQueue”,containerFactory=“sdbFactory”)
公共无效接收队列(OrderdToOrder){
试一试{
睡眠(5000);
}捕捉(中断异常e){
e、 printStackTrace();
}
ModelMapper ModelMapper=新的ModelMapper();
OrderEntity OrderEntity=modelMapper.map(order,OrderEntity.class);
试一试{
createOrder(orderEntity);
}捕获(例外e){
error(“尝试保持顺序时发生错误:{}错误为:{}”,顺序为e);
}
}
}

您需要显示如何使用它,以及配置,但默认情况下,使用
DefaultMessageListenerContainer
会话将进行
事务处理
,因此如果侦听器向容器抛出异常,事务将回滚,消息将添加回队列


如果侦听器正常退出,事务将提交,消息将被删除。

在处理完成之前不要确认消息,这样,如果处理失败,消息仍将在队列中,稍后可以传递给另一个消费者。我是否可以控制确认,如果是这样的话,我如何在spring boot中避免在处理成功完成之前确认发送方我已经用listener Producer的配置更新了问题您正在捕获异常这就是listener认为事务已提交的原因。请在记录错误后尝试引发异常。默认情况下,
DefaultMessageListenerContainer
不进行事务处理,并且代码段不使用事务。但是,其他海报是正确的,通过捕获
receiveQueue
方法中的异常并返回,消息将得到确认。您可能希望实现一个简单的errorHandler,如下所示:如果调用了任何错误处理程序,那么消息将不会被确认。或者,您可以抛出一个异常,并希望许多默认错误处理程序中的一个能够处理它。@DougGrove由于OP使用的是Spring Boot的自动配置容器工厂,所以它创建的容器在默认情况下确实是被处理的-请参阅。