java – 如何保证JMS可靠的交付

前端之家收集整理的这篇文章主要介绍了java – 如何保证JMS可靠的交付前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我认为使用JMS的很多(我的情况下是Spring)应用程序可能会遵循以下工作流程:

Database A ===> Producer ===> JMS Queue ===> Consumer ===> Database B

然后可靠性是一个问题.假设当数据库A中的数据记录应始终标记为已传递时,如果消息包含数据记录,则会真正使用数据记录,并将数据保留在数据库B中.然后有问题:

>据我所知,目前JMS协议没有定义任何从消费者向生产者发送确认的功能,而只定义为MOM,因此实际的消费者对生产者确认方法因JMS提供者而异.那么这是否意味着没有办法为这种确认开发一种可以适用于所有JMS产品(ActiveMQ,WebSphere MQ和Jboss MQ)的机制?
>考虑停电的情况,然后它是否会使队列中的消息消失,所以需要重新发送?或者不同的JMS产品可以获取剩余的内容,因为消息是序列化的,因此丢失的消息只能由事务管理或异步/同步配置引起,而不是因为应用程序服务器已关闭

最佳答案
JMS保证了消息的本质传递,如果消息被发布,那么无论发生什么,它都会传递给消费者,无论发生什么,MOM都是为了确保这一事实而设计的.无论如何,交付没有必要意味着处理.

各种机制确保可靠性:

>第一个是队列中消息的持久性(队列和消息必须标记为持久性,这是默认值),以确保在系统中断时不会丢失消息.
>然后您有确认和重试策略,消息将保留在队列中,直到消费者确认它,并且在交易会话的情况下,将重新传递,直到消费者有效地处理消息或达到最大重试.然后可以将失败的消息重定向到死信队列以进行分析.

为了确保两个数据源之间的一致性,您必须至少在生产者端使用XA事务(事务数据库A和JMS队列中至少隐含了2个资源),以保证消息不会发布到队列,如果数据库A中的提交失败,或者如果队列中的帖子失败,则不会更新数据库.消息消耗也应该进行处理以确保在回滚的情况下重新传递.

事务边界永远不会同时包含使用者和生产者,因为它与消息传递系统的异步性质相冲突,在消费者处理消息之前你无法锁定生产者端的资源,因为你无法保证什么时候会消息发生.

注意:如果您的数据库不支持XA(或提高性能),并且如果事务中只隐含了2个资源(数据库和JMS队列),您可以查看Logging Last Resource Transaction Optimization

猜你在找的Spring相关文章