@Transactional事务中发送MQ消息,事务还未完成但是消息已经发送

2023-10-27

@Transactional事务中发送MQ消息,事务还未完成但是消息已经发送
这种情况会导致一些问题:
1.事务还未提交,但是消息已经发送,这个时候消息中的一些信息提供给别人调用,但是别人调用并没有在数据库找到该记录(因为事务还未提交)
2.事务还未提交,但是成功的消息已经通知了别人,这时候事务因为某些原因出错回滚,但是别人却已经收到了成功的通知
解决办法:
事务提交后再发送消息


@Component
public class AmqpTemplateHelper {
 
    @Autowired
    private AmqpTemplate amqpTemplate;
 
    public <T> void send(String queue, T message) {
        // 是否开启事务判断
        if (TransactionSynchronizationManager.isSynchronizationActive()) {
            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
                @Override
                public void afterCommit() {
                    amqpTemplate.convertAndSend(queue, message);
                }
            });
        } else {
            amqpTemplate.convertAndSend(queue, message);
        }
    }
}

调用


	@Autowired
    private AmqpTemplateHelper amqpTemplateHelper;
 
    @Transactional
    public void save() {
        Person person = new Person();
        String name = "evan";
        person.setName(name);
        baseMapper.insert(person);
        amqpTemplateHelper.send("QUEUE_NAME", name);
    }

分析:

// 注册事务同步处理
TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronizationAdapter() {
@Override
public void afterCommit() {
    // 事务提交完毕时,触发:yourFunction
    yourFunction()}

原理:
提交一个事务同步处理,在事务commit之后执行,具体存放在threadLocal(线程本地变量)中,事务commit时会去threadLocal里边取。源码afterCommit是空的,没有任何操作,可见是spring专门预留给大家使用的。

源码:

TransactionSynchronizationAdapter是一个接口适配器,这样不用实现接口的全部方法,按需Override即可。类图如下图所示:
在这里插入图片描述

TransactionSynchronizationAdapter实现了2个接口:

TransactionSynchronization事务同步接口,
Ordered执行优先级
我们这里就是实现了TransactionSynchronization接口的afterCommit()方法,最终在事务commit提交后执行。

关于spring事务执行过程图:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

@Transactional事务中发送MQ消息,事务还未完成但是消息已经发送 的相关文章

  • 为什么 i++ 不是原子的?

    Why is i Java 中不是原子的 为了更深入地了解 Java 我尝试计算线程中循环的执行频率 所以我用了一个 private static int total 0 在主课中 我有两个线程 主题 1 打印System out prin
  • Java - 将节点添加到列表的末尾?

    这是我所拥有的 public class Node Object data Node next Node Object data Node next this data data this next next public Object g
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • 使用 Android 发送 HTTP Post 请求

    我一直在尝试从 SO 和其他网站上的大量示例中学习 但我无法弄清楚为什么我编写的示例不起作用 我正在构建一个小型概念验证应用程序 它可以识别语音并将其 文本 作为 POST 请求发送到 node js 服务器 我已确认语音识别有效 并且服务
  • Spark 1.3.1 上的 Apache Phoenix(4.3.1 和 4.4.0-HBase-0.98)ClassNotFoundException

    我正在尝试通过 Spark 连接到 Phoenix 并且在通过 JDBC 驱动程序打开连接时不断收到以下异常 为简洁起见 下面是完整的堆栈跟踪 Caused by java lang ClassNotFoundException org a
  • 操作错误不会显示在 JSP 上

    我尝试在 Action 类中添加操作错误并将其打印在 JSP 页面上 当发生异常时 它将进入 catch 块并在控制台中打印 插入异常时出错 请联系管理员 在 catch 块中 我添加了它addActionError 我尝试在jsp页面中打
  • Spring Data JPA 应用排序、分页以及 where 子句

    我目前正在使用 Spring JPA 并利用此处所述的排序和分页 如何通过Spring data JPA通过排序和可分页查询数据 https stackoverflow com questions 10527124 how to query
  • Mockito when().thenReturn 不必要地调用该方法

    我正在研究继承的代码 我编写了一个应该捕获 NullPointerException 的测试 因为它试图从 null 对象调用方法 Test expected NullPointerException class public void c
  • 斯坦福 NLP - 处理文件列表时 OpenIE 内存不足

    我正在尝试使用斯坦福 CoreNLP 中的 OpenIE 工具从多个文件中提取信息 当多个文件 而不是一个 传递到输入时 它会给出内存不足错误 All files have been queued awaiting termination
  • 如何在PreferenceActivity中添加工具栏

    我已经使用首选项创建了应用程序设置 但我注意到 我的 PreferenceActivity 中没有工具栏 如何将工具栏添加到我的 PreferenceActivity 中 My code 我的 pref xml
  • 禁止的软件包名称:java

    我尝试从数据库名称为 jaane 用户名 Hello 和密码 hello 获取数据 错误 java lang SecurityException Prohibited package name java at java lang Class
  • Java按日期升序对列表对象进行排序[重复]

    这个问题在这里已经有答案了 我想按一个参数对对象列表进行排序 其日期格式为 YYYY MM DD HH mm 按升序排列 我找不到正确的解决方案 在 python 中使用 lambda 很容易对其进行排序 但在 Java 中我遇到了问题 f
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 如何从指定日期获取上周五的日期? [复制]

    这个问题在这里已经有答案了 如何找出上一个 上一个 星期五 或指定日期的任何其他日期的日期 public getDateOnDay Date date String dayName 我不会给出答案 先自己尝试一下 但是 也许这些提示可以帮助
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 捕获的图像分辨率太大

    我在做什么 我允许用户捕获图像 将其存储到 SD 卡中并上传到服务器 但捕获图像的分辨率为宽度 4608 像素和高度 2592 像素 现在我想要什么 如何在不影响质量的情况下获得小分辨率图像 例如我可以获取或设置捕获的图像分辨率为原始图像分
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j

随机推荐

  • iOS下XMPP开发之XMPP开发环境配置(一)MySQL安装配置

    1 即时通讯技术简介 即时通讯技术 IM Instant Messaging 支持用户在线实时交谈 如果要发送一条信息 用户需要打开一个小窗口 以便让用户及其朋友在其中输入信息并让交谈双方都看到交谈的内容 有许多的IM系统 如AOL Yah
  • 【Note】关于研发合作中spillover(溢出)的理解

    1 文献中的描述 1 1 technology spillover 其中非常重要的一点是 称之为technology spillover 技术溢出 的部分直接影响的是成本 而不是其他的部分 效用之类的 意识到这个关键点之后 才理解了为什么很
  • Qt中静态变量使用方法

    静态变量可以在各个页面之前使用 先定义一个用于存放静态变量的类 例如datavar 在datavar h中添加如下代码 ifndef DATAVAR H define DATAVAR H include
  • Mybatis3 快速入门

    Mybatis3 快速入门 目前常见的持久层java框架有Hibernate Mybatis SpringData 笔者比较喜欢用SpringData Hibernate 和 Mybatis 也经常用 今天通过 Mybatis 的简介 数据
  • js 中的document.open 方法

    转载自 http blog 163 com hanyan102600 126 blog static 438503422008228111841848 document open 定义和用法 open 方法可打开一个新文档 并擦除当前文档的
  • 聊一聊Cookie(结合自己的学习方法分享一篇维基百科和一篇segmentfault(思否)好文)

    一 最近在带着Java服务端同学一起做一个新的项目 有一些基本的概念 无论是前端还是Java服务端 很多同学都是在按照经验办事 在一个公司的经验用很多年 经常容易犯经验主义的错误 很多时候 最基础的概念 最基本的东西还是要懂的 二 首先学习
  • Image Super-Resolution via Sparse Representation——基于稀疏表示的超分辨率重建

    经典超分辨率重建论文 基于稀疏表示 下面首先介绍稀疏表示 然后介绍论文的基本思想和算法优化过程 最后使用python进行实验 稀疏表示 稀疏表示是指 使用过完备字典中少量向量的线性组合来表示某个元素 过完备字典是一个列数大于行数的行满秩矩阵
  • C# 调用Qt 库

    转载 C 调用Qt 库 tangkaixuan 的博客 CSDN博客 c qt Qt创建动态库给C 调用 通过回调完成交互 DS小龙哥的博客 CSDN博客 qt怎么调用c
  • ant design change等方法默认传值加上自定义参数传值

  • 时间序列 R 08 指数平滑 Exponential smoothing

    1 1 简单指数平滑 simple exponential smoothing SES SES适用于不计趋势与季节性的时间序列 我们在可以使用平均值模型和naive模型来做粗略的预测 点击查看 他们懂预测方法分别是 使用最后一个值 naiv
  • STM32F042 CAN使用例子

    代码如下 include mycan h CAN初始化 tsjw 重新同步跳跃时间单元 范围 1 3 CAN SJW 1tq CAN SJW 2tq CAN SJW 3tq CAN SJW 4tq tbs2 时间段2的时间单元 范围 1 8
  • tensorfllow-gpu遇到gpu资源不够的情况

    本人windows10测试tensorflow gpu的资源使用情况 开启两个tensorflow gpu进程 两个进程的代码一致 第一个进程创建随机变量后gpu使用情况如下 第二个进程创建随机变量时gpu使用情况如下 可以看到已经快使用完
  • Linux配置和使用Git

    本文已收录至 Linux知识与编程 专栏 作者 ARMCSKGT 演示环境 CentOS 7 目录 前言 正文 注册Giett构建仓库 注册giett 构建仓库 Linux配置Git 下载Git 配置Git用户名 配置Git账户邮箱 验证是
  • Qt(c++)调用海康威视监控摄像头

    文章目录 一 海康威视监控摄像头开发SDK介绍 二 海康SDK模块说明 三 Qt项目中海康威视SDK配置 四 实时预览摄像头图像程序 一 海康威视监控摄像头开发SDK介绍 设备网络SDK是基于设备私有网络通信协议开发的 为嵌入式网络硬盘录像
  • 探究软件测试人员的进阶之路

    一谈到进阶 大部分文章 包括前面一些文章也会写到职级如何从初级 中级 高级 一直进阶到专家级 然后写上每个级别所需要的知识技能 然而 我们掌握了这些所谓初 中 高的知识和技能 真的就能成为测试专家了吗 对于这个问题 大部分人应该都带着疑惑或
  • qt导入html css样式表,第45篇 进阶(五)Qt样式表

    第45篇 进阶 五 Qt样式表 导语 一个完善的应用程序不仅应该有实用的功能 还要有一个漂亮的外观 这样才能使应用程序更加友善 更加吸引用户 作为一个跨平台的UI开发框架 Qt提供了强大而灵活的界面外观设计机制 Qt样式表是一个可以自定义部
  • 分数阶导数的意义_导数的意义

    分数阶导数的意义 钙衍生物 CALCULUS DERIVATIVES After derivative theory posts we will start to see some of the applications that make
  • 私人用的红帽linux,红帽宣布为个人开发者提供16个RHEL免费许可 支持在生产环境中使用...

    自从红帽宣布结束CentOS操作系统后就引起很多争议 按红帽计划CentOS 8将是最后的版本并且会在年底停更 这使得很多依赖该操作系统的个人和企业无比愤怒 因为这突如其来的变更将会导致大量生产环境需要更换系统 现在红帽为平息用户愤怒正在扩
  • 双极性SPWM波生成

    本篇文章主要介绍用于逆变电路的双极性SPWM波生成 SPWM波就是脉冲宽度按正弦规律变化和正弦波等效的PWM波形 用于控制逆变电路中开关器件的通断 使其输出的脉冲电压的面积与所希望输出的正弦波在相应区间内的面积相等 经滤波后可以得到正弦波输
  • @Transactional事务中发送MQ消息,事务还未完成但是消息已经发送

    Transactional事务中发送MQ消息 事务还未完成但是消息已经发送 这种情况会导致一些问题 1 事务还未提交 但是消息已经发送 这个时候消息中的一些信息提供给别人调用 但是别人调用并没有在数据库找到该记录 因为事务还未提交 2 事务