原创

Spring Boot事务提交后执行异步代码

温馨提示:
本文最后更新于 2024年02月07日,已超过 19 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

一般情况下,我们在使用事务时,都是在方法上添加一个@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会失效)
正文到此结束
本文目录