当前位置: 首页 > java >正文

TransactionSynchronizationManager事务同步器的使用

 方法一、监听到需要处理的事件  这个需要完善一下处理失败后重试的逻辑

 

@Component
public class OrderEventListener {@TransactionalEventListener(phase = TransactionPhase.AFTER_COMMIT)
//    @Async  // 异步执行public <T> void onApplicationEvent(BaseEvent<T> event) {MessageSender.sendMQMessage(event);}
}

  方法二、

import lombok.extern.slf4j.Slf4j;
import org.springframework.transaction.support.TransactionSynchronization;
import org.springframework.transaction.support.TransactionSynchronizationAdapter;@Slf4j
public class MqMessageCommitHook extends TransactionSynchronizationAdapter {private final Runnable action;public MqMessageCommitHook(Runnable action) {this.action = action;}@Overridepublic void afterCommit() {try {//todo 这里可以修改为异步处理action.run();} catch (Exception e) {// 记录日志或进行补偿处理log.error("Failed to execute afterCommit logic", e);}}@Overridepublic void beforeCommit(boolean readOnly) {log.error("================beforeCommit============");}@Overridepublic void flush() {log.error("================flush============");}@Overridepublic void beforeCompletion() {log.error("================beforeCompletion============");}@Overridepublic void afterCompletion(int status) {if (TransactionSynchronization.STATUS_COMMITTED == status) {log.info("=========afterCompletion======事务提交==============");} else if (TransactionSynchronization.STATUS_ROLLED_BACK == status) {log.info("========afterCompletion=========事务回滚============");}}}

 

    @Override@Transactional(rollbackFor = {Exception.class})public void saveBatch(Integer size) {ArrayList<Algorithm> objects = new ArrayList<>();for (int i = 0; i < size; i++) {Algorithm algorithm = new Algorithm();algorithm.setAlgoCode(i + "");algorithm.setAlgoName("name" + i);algorithm.setServiceNum(222);algorithm.setAlgoApiDoc("xxxxxxxxxxxxxxxxxxxxx");algorithm.setAlgoDescribe("xxxxxxxxxxxxxxxxxxxxx");algorithm.setAlgoDeclare("xxxxxxxxxxxxxxxxxxxxx");algorithm.setAlgoDescribeDetail("xxxxxxxxxxxxxxxxxxxxx");algorithm.setAlgoType("1");algorithm.setAlgoVersion("xxxxxxxxxxxxxxxxxxxxx");algorithm.setAlgoOwner("xxxxxxxxxxxxxxxxx");algorithm.setStatus(99);algorithm.setViewNum(9999);algorithm.setUpdateBy("ddddd");algorithm.setCreateBy("ddddd");objects.add(algorithm);}this.getBaseMapper().InsertBatchEntity(objects);
//       this.getBaseMapper().insertBatchSomeColumn(objects);
//        boolean b = saveBatch(objects, 5);// 方式一使用   发布事件(事务提交后触发)eventPublisher.publishEvent(new OrderCreatedEvent(objects.get(1), "msgType add", "uniqueKey"));//方法二使用TransactionSynchronizationManager.registerSynchronization(new MqMessageCommitHook(() -> MessageSender.sendMQMessage(new OrderCreatedEvent(objects.get(1), "msgType add 1", "uniqueKey"))));}

 

@Slf4j
public class OrderCreatedEvent extends BaseEvent<Algorithm> {public OrderCreatedEvent(Algorithm data, String msgType, String uniqueKey) {super(data, msgType, uniqueKey);}
}

 

@Getter
public abstract class BaseEvent<T> {private final T data;private final String msgType;private final String uniqueKey;public BaseEvent(T data, String msgType, String uniqueKey) {this.data = data;this.msgType = msgType;this.uniqueKey = uniqueKey;}}

具体的业务逻辑处理

 

public class MessageSender {public static <T> void sendMQMessage(BaseEvent<T> event) {// 发送消息到指定的交换机和路由键System.out.println("MQ Message sent: " + event);}
}
http://www.xdnf.cn/news/7384.html

相关文章:

  • 统计客户端使用情况,使用es存储数据,实现去重以及计数
  • 【全解析】EN18031标准下的SCM安全通信机制全解析
  • 质检LIMS系统检测数据可视化大屏 全流程提效 + 合规安全双保障方案
  • 视频监控中的存储方式有哪些?EasyCVR视频监控汇聚平台如何打造高效监控存储
  • 高速系统设计实例设计分析之三
  • 蓝桥杯2300 质数拆分
  • 码蹄集——N是什么、棋盘
  • JVM(Java 虚拟机)深度解析
  • web基础常用标签
  • More Effective C++:改善编程与设计(下)
  • Seata源码—6.Seata AT模式的数据源代理三
  • 洛谷U536262 井底之“鸡” 附视频讲解
  • 提示词专家的修炼秘籍
  • harris角点检测
  • VisionPro:轴承错位标识
  • QT之绘图模块和双缓冲技术
  • MapStruct Date 转 LocalDate 偏差一天问题
  • 【C++】异常解析
  • AGI大模型(28):LangChain提示模板
  • MySQL中的Change Buffer是什么,它有什么作用?
  • 火山 RTC 引擎9 ----集成 appkey
  • 5月19日笔记
  • 4.7 时间模块
  • 网络传输(ping命令,wget命令,curl命令),端口
  • 接口排查不能靠猜:实战中如何用抓包工具精准定位问题(含 Charles 使用示例)
  • 人工智能、机器学习与深度学习:全面介绍与对比分析
  • 组态王通过开疆智能profinet转ModbusTCP网关连接西门子PLC配置案例
  • 队列和栈的区别
  • 【科研项目】大三保研人科研经历提升
  • Windows多功能工具箱软件推荐