首页 > 其他分享 >异步线程解决seata事务1000问题

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

时间:2023-06-07 11:12:59浏览次数:46  
标签:seata setRejectedExecutionHandler 线程 threadPollConfigProperties new 1000 threadP

原因: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

标签:seata,setRejectedExecutionHandler,线程,threadPollConfigProperties,new,1000,threadP
From: https://www.cnblogs.com/IamHzc/p/17462769.html

相关文章

  • 多线程:线程创建方式二(匿名内部类写法)
        ......
  • 线程池
    一、ThreadLocal 1、使得每个线程可以有自己的专属变量2、可以将ThreadLocal类形象的比喻成存放数据的盒子,盒子中可以存储每个线程的私有数据。importjava.text.SimpleDateFormat;importjava.util.Random;publicclassThreadLocalExampleimplementsRunnable{/......
  • 线程池的工作过程
    转载:https://www.bilibili.com/video/BV1Ka411i7qC/?spm_id_from=333.337.search-card.all.click&vd_source=46d50b5d646b50dcb2a208d3946b1598......
  • 线程与进程
    一、线程与进程的区别1、进程是程序的一次执行过程,是程序运行的基本单位2、进程是比线程更小的执行单位,一个进程可以产生多个线程,多个线程共享进程的堆和方法区,每个线程都有自己独立的栈和程序计数器,因此线程之间切换的开销比进程切换小 二、并发与并行并发:同一时间段内,多......
  • 01_多线程
    多线程一、进程与线程1.1、进程:进程:是正在运行的程序是系统进行资源分配和调用的独立单位每个进程都有它自己的内存空间和系统资源 1.2、线程:在一个进程内部,可以执行一个任务,也可以执行多个任务线程:是进程中的单个执行顺序控制流,是一条执行路径单线程:一个进程......
  • DW1000芯片的RF测试与校准:发射功率校准
    说明在前面的博客中,已经介绍过发射功率的测量和设置了,其实发射功率的校准基本上也没什么可说了。基本就是和晶振校准流程类似,通过设置芯片寄存,调整测出一个合适的功率值,能保证发射机发射功率不超过标准要求的41.3dBm/Mhz。校准基本流程和晶振校准类似,发射功率校准流程如下,:由......
  • C# 线程池ThreadPool的用法简析
    什么是线程池?为什么要用线程池?怎么用线程池?1.什么是线程池?.NETFramework的ThreadPool类提供一个线程池,该线程池可用于执行任务、发送工作项、处理异步I/O、代表其他线程等待以及处理计时器。那么什么是线程池?线程池其实就是一个存放线程对象的“池子(pool)”,他提供了一些基本方......
  • 41.QT-多线程与界面之间交互总结
    1.线程与界面组件需要注意的地方在QThread线程中不能直接创建QWidget之类的界面组件.因为在QT中,所有界面组件相关的操作都必须在主线程中(也就是GUIthread)所以,QThread线程不能直接操作界面组件.2.QThread线程如何操作界面组件-方法1将多线程类对象封装为GUI界面类的类成员然......
  • 1000的阶乘
    #defineNUM3000#include<stdio.h>intmain(){ intnNum=0; //存储1000阶乘数据: intaryBuff[NUM]={0}; //初始化最数组为下标为0,为1: aryBuff[0]=1; printf("请输入阶乘:\n"); scanf_s("%d",&nNum); //遍历1-nNum的因子: for(inti=2;i<=nNum;i++)......
  • Java中为什么禁止把SimpleDateFormat定位为static变量以及如果非要使用static定位Simp
    场景Java中ExecutorService线程池的使用(Runnable和Callable多线程实现):https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/126242904Java中创建线程的方式以及线程池创建的方式、推荐使用ThreadPoolExecutor以及示例:https://blog.csdn.net/BADAO_LIUMANG_QIZHI/art......