美文网首页Java 杂谈互联网科技程序员
阿里高级架构师教你使用Spring JMS处理消息事务源码案例

阿里高级架构师教你使用Spring JMS处理消息事务源码案例

作者: 老男孩_Misaya | 来源:发表于2018-09-08 22:51 被阅读1次

    消费者在接收JMS异步消息的过程中会发生执行错误,这可能会导致信息的丢失。该源码展示如何使用本地事务解决这个问题。这种解决方案可能会导致在某些情况下消息的重复(例如,当它会将信息储存到数据库,然后监听执行失败)。之所以出现这种情况是因为JMS交易是独立于像数据库等事务性资源。如果您的处理不是幂等或者如果您的应用程序不支持重复消息检测,那么你将不得不使用分布式事务。分布式事务是超出了本源码案例的范围。

    消费者的代码如下:

    @Component("notificationProcessor")publicclassNotificationProcessorimplementsMessageListener{privatestaticLogger logger = LoggerFactory.getLogger(NotificationProcessor.class);@AutowiredprivateJdbcTemplate jdbcTemplate;@OverridepublicvoidonMessage(Message message){try{Notification notification = (Notification) ((ObjectMessage) message).getObject();logger.info("Received notification | Id: "+notification.getId()+" | Redelivery: "+getDeliveryNumber(message));     checkPreprocessException(notification);saveToBD(notification);checkPostprocessException(message, notification);}catch(JMSException e) {throwJmsUtils.convertJmsAccessException(e);}}  ...}

    当带有id=1的notification到达时, checkPreprocessException 将抛出一个运行错误,在存储消息到数据库之前引法一个错误。

    当带有id=2的notification到达时,checkPostprocessException方法将抛出一个exception,这样在存储数据库之后引发一个错误。

    当消息已经被发送以后,getDeliveryNumber 方法返回次数,这里使用事务机制

    saveToDB是存储一个notification 到数据库.

    大家可以点击加入群:【Java进阶高级架构群】:855355016,里面有Java高级大牛直播讲解知识点 走的就是高端路线,(如果你想跳槽换工作 但是技术又不够 或者工作上遇到了瓶颈 ,我这里有一个JAVA的免费直播课程 ,讲的是高端的知识点基础不好的误入哟,只要你有1-5年的开发经验可以加群找我要课堂链接 注意:是免费的 没有开发经验误入哦)

    写在最后:欢迎留言讨论,加关注,持续更新!!!

    相关文章

      网友评论

        本文标题:阿里高级架构师教你使用Spring JMS处理消息事务源码案例

        本文链接:https://www.haomeiwen.com/subject/aqzlgftx.html