利用事务钩子函数解决业务异步发送问题

一、问题背景

在这里插入图片描述
在某项业务中,需要在事务完成后,写入日志到某数据库中。需要要么都成功,要么都失败,而且需要异步实现。在不考虑分布式事务框架下,如何实现这个业务功能呢?

二、实现方案

前提需要启动kafka_2.12-3.9.1内置的zookeeper和kafka。
在这里插入图片描述
在这里插入图片描述
在kafka创建好topic

kafka-topics.bat --create --bootstrap-server localhost:9092 --replication-factor 1 --partitions 1 --topic testTopic

在这里插入图片描述
在这里插入图片描述
可以利用事务钩子函数实现异步发送,保证同时成功和失败。注册事务钩子,在事务提交或回滚后执行。

if (!TransactionSynchronizationManager.isSynchronizationActive()) {
   
   
            // 调用异步方法发送日志
            System.out.println("事务未开启");

            // 异步发送日志(解决由于同一个类内部方法调用不会创建代理,所以aop不生效,则@Async注解无作用问题)
            kafkaSender.send();
        } else {
   
   
            // 注册事务钩子,在事务提交或回滚后执行
            TransactionSynchronizationManager.registerSynchronization(new TransactionSynchronization() {
   
   
                @Override
                public void afterCompletion(int status) {
   
   
                    System.out.println("事务开启并执行完毕");

                    // 异步发送日志(解决由于同一个类内部方法调用不会创建代理,所以aop不生效,则@Async注解无作用问题)
                    kafkaSender.send();
                }
            });
        }

1、生产者代码

KafkaController

@RestController
public class KafkaController {
   
   
    @Autowired
    private TestService testService;

    @GetMapping("/send/{type}")
    public String sendMessageToKafka(@PathVariable int type) {
   
   
        if(type == 1){
   
   
            // 模拟执行事务未开启的业务逻辑
            testService.executeServiceNoTranscational
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值