SpringBoot事务提交后执行异步代码

Laughing
2022-05-21 / 1 评论 / 2,649 阅读 / 正在检测是否收录...
温馨提示:
本文最后更新于2022年05月21日,已超过972天没有更新,若内容或图片失效,请留言反馈。

一般情况下,我们在使用事务时,都是在方法上添加一个@Transactional注解

 @Transactional(rollbackFor = Exception.class)
    public void test1() {
       
    }

但是有些时候,除了主要核心业务外,我们可能还需要推送消息,但是推送消息我们又需要使用我们核心业务的数据,比如我在核心业务代码中执行了插入,之后需要异步获取插入的数据,推送消息或者发送给异构系统,这个时候,我们可以使用Spring Boot提供的TransactionSynchronization接口,并实现afterCommit方法

package com.example.demo.service;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.transaction.support.TransactionSynchronizationAdapter;
import org.springframework.transaction.support.TransactionSynchronizationManager;

import javax.annotation.Resource;

@Service
public class Test123Service {

    @Resource
    Test2Service test2Service;

    @Transactional(rollbackFor = Exception.class)
    public void test1() {
        boolean synchronizationActive = TransactionSynchronizationManager.isSynchronizationActive();
        if (synchronizationActive) {
            TransactionSynchronizationManager.registerSynchronization(
                    new TransactionSynchronizationAdapter() {
                        @Override
                        public void afterCommit() {
                            test2Service.test2();
                        }
                    }
            );
        } else {
            test2Service.test2();
        }
    }
}
package com.example.demo.service;

import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

@Service
public class Test2Service {

    @Async
    public void test2(){
        System.out.println("test2");
    }

}
注意:方法test1()不能调用同一给类中使用了@Async注解的方法test2()(此时@Async会失效)
1

评论 (1)

取消
  1. 头像
    天下第一
    Android · Google Chrome

    画图

    回复