首页 > 其他分享 >关于配置执行定时任务和异步任务的线程池配置类

关于配置执行定时任务和异步任务的线程池配置类

时间:2022-11-23 20:55:51浏览次数:32  
标签:异步 配置 springframework 线程 import org threadPoolTaskExecutor threadPoolTaskSchedul

package com.liftsail.rsademo.utils;

import lombok.extern.slf4j.Slf4j;
import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.scheduling.TaskScheduler;
import org.springframework.scheduling.annotation.AsyncConfigurer;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor;
import org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.config.Task;

import java.util.concurrent.Executor;
import java.util.concurrent.ThreadPoolExecutor;

/**
* @Author 张帆
* @Description 不积跬步无以至千里
* @Date 2022/11/23 20:50
*/
@Configuration
@Slf4j
public class ThreadPoolConfig implements AsyncConfigurer, SchedulingConfigurer {

/**
* 异步任务执行线程池参数
*/
private static final Integer CORE_POOL_SIZE = 5;
private static final Integer MAX_POOL_SIZE = 200;
private static final Integer QUEUE_CAPACITY = 2000;
private static final String THREAD_NAME_PREFIX = "async-thread-";
private static final Integer KEEP_ALIVE_SECONDS = 60;

/**
* 定时任务线程池线程名前缀
*/
private static final String SCHEDULER_THEREAD_NAME_PREFIX = "task-";

/**
* @param
* @description: 创建执行spring task定时任务的线程池,调用@scheduled注解的定时任务
* @author: xiaomifeng1010
* @date: 2022/3/13
* @return: TaskScheduler
**/
@Bean
public ThreadPoolTaskScheduler threadPoolTaskScheduler() {
ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler();
threadPoolTaskScheduler.setPoolSize(10);
threadPoolTaskScheduler.setThreadNamePrefix(SCHEDULER_THEREAD_NAME_PREFIX);
threadPoolTaskScheduler.setWaitForTasksToCompleteOnShutdown(true);
return threadPoolTaskScheduler;
}

/**
* @param
* @description: 创建执行异步任务的线程池,用于调用 @async注解的方法
* @author: xiaomifeng1010
* @date: 2022/3/13
* @return: ThreadPoolTaskExecutor
**/
@Bean("asyncThreadPoolTaskExecutor")
public ThreadPoolTaskExecutor asyncThreadPoolTaskExecutor() {
ThreadPoolTaskExecutor threadPoolTaskExecutor = new ThreadPoolTaskExecutor();
// 核心线程数量
threadPoolTaskExecutor.setCorePoolSize(CORE_POOL_SIZE);
// 最大线程数量
threadPoolTaskExecutor.setMaxPoolSize(MAX_POOL_SIZE);
// 队列中最大任务数
threadPoolTaskExecutor.setQueueCapacity(QUEUE_CAPACITY);
// 线程名称前缀
threadPoolTaskExecutor.setThreadNamePrefix(THREAD_NAME_PREFIX);
// 当达到最大线程数时如何处理新任务(拒绝策略)
threadPoolTaskExecutor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
// 线程空闲后最大存活时间
threadPoolTaskExecutor.setKeepAliveSeconds(KEEP_ALIVE_SECONDS);
// 初始化线程池
threadPoolTaskExecutor.initialize();
// 关闭线程池
threadPoolTaskExecutor.setWaitForTasksToCompleteOnShutdown(true);
return threadPoolTaskExecutor;
}

/**
* Callback allowing a {@link TaskScheduler
* TaskScheduler} and specific {@link Task Task}
* instances to be registered against the given the {@link ScheduledTaskRegistrar}.
*
* @param taskRegistrar the registrar to be configured.
*/
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.setTaskScheduler(threadPoolTaskScheduler());
}

/**
* The {@link Executor} instance to be used when processing async
* method invocations.
*/
@Override
public Executor getAsyncExecutor() {
return asyncThreadPoolTaskExecutor();
}

/**
* The {@link AsyncUncaughtExceptionHandler} instance to be used
* when an exception is thrown during an asynchronous method execution
* with {@code void} return type.
*/
@Override
public AsyncUncaughtExceptionHandler getAsyncUncaughtExceptionHandler() {
return (throwable, method, objects) -> {
log.error("异步任务执行出现异常, message {}, method {}, params {}", throwable, method, objects);
};
}
}

标签:异步,配置,springframework,线程,import,org,threadPoolTaskExecutor,threadPoolTaskSchedul
From: https://www.cnblogs.com/liftsail/p/16919761.html

相关文章

  • Spring配置数据源
    //dataSource.javapackagespring_ioc_anno;importjava.beans.PropertyVetoException;importjava.sql.Connection;importjava.util.ResourceBundle;importjavax......
  • Ubuntu安装配置
    镜像:官网服务器版本镜像:ubuntu-20.04.4-live-server-amd64创建虚拟时选择开启WMX才可以和WSL共存安装:系统安装时:配置40G空间选择获取github的公钥自动开启ssh连接......
  • IDEA与tomcat相关配置、Servlet_体系结构
    IDEA与tomcat相关配置IDEA会为每一个tomcat部署的项目单独建立一份配置文件查看控制台的log:"C:\Users\drm\AppData\Local\JetBrains\IntelliJIdea2022.1\tom......
  • Mysql:字符编码与配置文件、数据库存储引擎、创建表的完整语法、MySQL字段基本数据类
    目录字符编码与配置文件数据库存储引擎创建表的完整语法字段类型之整型严格模式字段类型之浮点型字段类型之字符类型数字的含义字段类型之枚举与集合字段类型之日期类型字......
  • 手动创建线程池+自定义拒绝策略
    try{ThreadFactorytycThreadFactory=newThreadFactoryBuilder().setNamePrefix("tyc-call-inf").build();//拒绝策略,超过线程数+......
  • Servlet_生命周期详解、3.0注解配置
    Servlet_生命周期详解Servlet中的生命周期方法: 1.被创建:执行init方法,只执行一次Servlet什么时候被创建?默认情况下,第一次被访问时,Servlet被创建......
  • 配置RSVP-TE隧道示例
    组网需求如下图所示,节点LSRA、LSRB、LSRC和LSRD运行IS-IS,都属于Level-2。使用RSVP-TE从LSRA到LSRD建立一条TE隧道,带宽为20Mbit/s。隧道沿途的链路最大可预留带宽为100Mbi......
  • 7. 主从配置
    一个master可以拥有多个slave,一个slave又可以拥有多个slave,如此下去,形成了强大的多级服务器集群架构master用来写数据,slave用来读数据,经统计:网站的读写比率是10:1通过主......
  • 8. 集群配置
    1为什么要有集群一主可以多从,如果同时访问量过大(1000w),主服务肯定就会挂掉,数据服务挂掉了或者发生自然灾难大公司都会有很多服务器(华东地区、华南地区、华中地区、......
  • 核心交换机配置DHCP服务,这篇文章有详细的步骤和命令
    动态主机配置协议DHCP(DynamicHostConfigurationProtocol)是一种用于集中对用户IP地址进行动态管理和配置的技术。 下面我为大家整理了非常详细的配置步骤和命令,仅供......