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

消费者的代码如下:

@Component("notificationProcessor")

public class NotificationProcessor implements MessageListener {

private static Logger logger = LoggerFactory.getLogger(NotificationProcessor.class);

@Autowired

private JdbcTemplate jdbcTemplate;

@Override

public void onMessage(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) {

throw JmsUtils.convertJmsAccessException(e);

}

}

...

}

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

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

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

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

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

阿里高级架构师教你使用Spring JMS处理消息事务源码案例的更多相关文章

  1. 阿里高级架构师教你使用Spring Cloud Sleuth跟踪微服务

    随着微服务数量不断增长,需要跟踪一个请求从一个微服务到下一个微服务的传播过程,Spring Cloud Sleuth 正是解决这个问题,它在日志中引入唯一ID,以保证微服务调用之间的一致性,这样你就能 ...

  2. 阿里高级架构师教你如何使用Spring Cloud Ribbon重试请求

    在微服务调用中,一些微服务圈可能调用失败,通过再次调用以达到系统稳定性效果,本文展示如何使用Ribbon和Spring Retry进行请求再次重试调用. 在Spring Cloud中,使用load b ...

  3. 十年阿里顶级架构师教你怎么使用Java来搭建微服务

    微服务背后的大理念是将大型.复杂且历时长久的应用在架构上设计为内聚的服务,这些服务能够随着时间的流逝而演化.本文主要介绍了利用 Java 生态系统构建微服务的多种方法,并分析了每种方法的利弊. 快速预 ...

  4. 详解阿里P7架构师是怎么在Spring中实现事务暂停

    摘要 Spring框架是一个流行的基于轻量级控制反转容器的Java/J2EE应用框架,尤其在数据访问和事务管理方面的能力是众所周知的.Spring的声明性事务分离可以应用到任何POJO目标对象,并且包 ...

  5. SpringBoot 源码解析 (八)----- Spring Boot 精髓:事务源码解析

    本篇来讲一下SpringBoot是怎么自动开启事务的,我们先来回顾一下以前SSM中是如何使用事务的 SSM使用事务 导入JDBC依赖包 众所周知,凡是需要跟数据库打交道的,基本上都要添加jdbc的依赖 ...

  6. 阿里 P8 高级架构师吐血总结的 《Java 核心知识整理&面试.pdf》| 免费分享

    最近在网上发现一份非常棒的 PDF 资料,据说是阿里 P8 级高级架构师吐血总结的, 其中内容覆盖很广,包括 Java 核心基础.Java 多线程.高并发.Spring.微服务.Netty 与 RPC ...

  7. 阿里Java架构师分享自己的成长经历,教你如何快速成长为架构师

    架构师是公司的“金领”,很少需要考虑生存的问题,从而有更多的精力思考关键技术,形成“强者愈强”的良性循环.当然,冰冻三尺非一日之寒,成为一名合格的架构师是一个漫长的积累过程.对于大部分的软件开发人员来 ...

  8. 十年阿里java架构师的六大设计原则和项目经验

      先看一幅图吧: 这幅图清晰地表达了六大设计原则,但仅限于它们叫什么名字而已,它们具体是什么意思呢?下面我将从原文.译文.理解.应用,这四个方面分别进行阐述. 1.单一职责原则(Single Res ...

  9. 看阿里P9架构师如何向你定义架构及架构师

    架构的定义 先来看看软件架构的普遍定义吧. 一个程序和计算系统软件体系结构是指系统的一个或多个结构.结构中包括软件的构建,构建的外部可见属性以及它们之间的相互关系. 体系结构并非可运行软件.确切的说, ...

随机推荐

  1. python检测音频中的静音

    #-*- coding: utf-8 -*- import os import wave from time import sleep import numpy as np SUCCESS = 0 F ...

  2. javascript从网络下载随机笑话

    /*** * 讲笑话函数(调试用) * @param callback 回调函数 */ function randomText(callback) { var result =''; $.ajax({ ...

  3. ElasticSearch——原始文档和倒排索引

    一.原始文档 如上图所示, 第二象限是一份原始文档,有title和content2个字段,字段取值分别为”我是中国人”和” 热爱共X产党”,这一点没什么可解释的.我们把原始文档写入Elasticsea ...

  4. python判断命令执行成功

    if os.system('lss') !=0: print 'Without the command'

  5. 多线程,线程池与BeginInvoke()

    在WinForm中,很多情况下需要用到多线程,下面我来简单介绍一下多线程的基本用法. 1.线程.   (1)线程的初始化  Thread t = new Thread(new ThreadStart( ...

  6. linux查看物理cpu的核数,个数,逻辑cpu的个数

    # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数 # 查看物理CPU个数 cat /proc/cpuinfo| ...

  7. 打印网页js

    ====================================设置打印样式 <style media="print"> .Noprint { display: ...

  8. OS填空题练习

    1.操作系统的基本特征:并发性:共享性:虚拟性:异步性. 2.操作系统的设计目标:方便性:有效性:可扩充性:开放性. 3.操作系统的主要功能:处理机管理:存储器管理:设备管理:文件管理:用户接口. 4 ...

  9. 26.Spark创建RDD集合

    打开eclipse创建maven项目 pom.xml文件 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:x ...

  10. [转帖]Oracle数据库lob大对象数据类型字段总结,值得收藏

    Oracle数据库lob大对象数据类型字段总结,值得收藏 原创 波波说运维 2019-07-11 00:02:00 https://www.toutiao.com/i67108943269703357 ...