异步线程解决seata事务1000问题

原因:seata1.5.0以下版本,事务执行sql超过1000,会抛出异常。
解决方案:部分sql使用异步线程。
实现方式:
1、初始化异步线程池

@Configuration
@EnableAsync
public class ThreadAsyncConfig implements AsyncConfigurer {

    /**
     * 线程配置参数
     */
    @Autowired
    private ThreadPollConfigProperties threadPollConfigProperties;


    
    @Bean("threadPoolTaskAsyncExecutor")
    public ThreadPoolTaskExecutor threadPoolTaskAsyncExecutor() {
        ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
        // 核心线程数
        threadPoolTaskExecutor.setCorePoolSize(3);
        // 最大线程数
        threadPoolTaskExecutor.setMaxPoolSize(10);
        // 队列容量大小
        threadPoolTaskExecutor.setQueueCapacity(threadPollConfigProperties.getCapacity());
        // 是否允许核心线程超时
        threadPoolTaskExecutor.setAllowCoreThreadTimeOut(threadPollConfigProperties.getAllowCoreThreadTimeOut());
        // 线程保活时间
        threadPoolTaskExecutor.setKeepAliveSeconds(threadPollConfigProperties.getKeepAliveTime());
        // 线程命名前缀规则
        threadPoolTaskExecutor.setThreadNamePrefix(threadPollConfigProperties.getThreadNamePrefix());
        // 等待终止时间(秒)
        threadPoolTaskExecutor.setAwaitTerminationSeconds(threadPollConfigProperties.getAwaitTerminationSeconds());
        /**
         * 线程池满了之后如何处理:默认是 new AbortPolicy();
         * (1) ThreadPoolExecutor.AbortPolicy   处理程序遭到拒绝将抛出运行时RejectedExecutionException;
         * (2) ThreadPoolExecutor.CallerRunsPolicy 线程调用运行该任务的 execute 本身。此策略提供简单的反馈控制机制,能够减缓新任务的提交速度
         * (3) ThreadPoolExecutor.DiscardPolicy  不能执行的任务将被删除;
         * (4) ThreadPoolExecutor.DiscardOldestPolicy  如果执行程序尚未关闭,则位于工作队列头部的任务将被删除,然后重试执行程序(如果再次失败,则重复此过程)。
         */
        switch (threadPollConfigProperties.getRejectedExecutionHandler()){
            case "AbortPolicy":
                threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
                break;
            case "CallerRunsPolicy":
                threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
                break;
            case "DiscardPolicy":
                threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardPolicy());
                break;
            case "DiscardOldestPolicy":
                threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.DiscardOldestPolicy());
                break;
            default:
                threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.AbortPolicy());
                break;
        }
        // 初始化线程池
        threadPoolTaskExecutor.initialize();
        return threadPoolTaskExecutor;
    }
}

2、在启动类添加@EnableAsync注解。
3、创建异步线程服务类,并使用AsyncService asyncService= (AsyncService) AopContext.currentProxy();调用服务类方法。
注意:不可以在其他bean中使用@Autorwire@Reource注入AsyncService

posted @   IamHzc  阅读(234)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
历史上的今天:
2021-06-07 start from the beginning-JAVA(接口、多态)
2021-06-07 JAVA练习-继承-发红包案例
2021-06-07 start from the beginning-JAVA(继承、super、this、抽象类)
点击右上角即可分享
微信分享提示
主题色彩