首页 > 其他分享 >@Schedule定时任务和异步注解@Async时推荐自定义线程池

@Schedule定时任务和异步注解@Async时推荐自定义线程池

时间:2024-07-29 10:20:51浏览次数:13  
标签:异步 自定义 Schedule 任务 线程 executor Async public

1.原因

@Schedule定时任务和异步注解@Async使用的默认线程池时, 池中允许的最大线程数和最大任务等待队列都是Integer.MAX_VALUE

2.解决

2.1、可以手动异步编排,交给某个线程池来执行。

首先我们先向Spring中注入一个我们自己编写的线程池,参数自己设置即可,我这里比较随意。

 @Configuration
 public class MyTheadPoolConfig {
 
     @Bean
     public TaskExecutor taskExecutor() {
         ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
         //设置核心线程数
         executor.setCorePoolSize(10);
         //设置最大线程数
         executor.setMaxPoolSize(20);
         //缓冲队列200:用来缓冲执行任务的队列
         executor.setQueueCapacity(200);
         //线程活路时间 60 秒
         executor.setKeepAliveSeconds(60);
         //线程池名的前缀:设置好了之后可以方便我们定位处理任务所在的线程池
         // 这里我继续沿用 scheduling 默认的线程名前缀
         executor.setThreadNamePrefix("nzc-create-scheduling-");
         //设置拒绝策略
         executor.setRejectedExecutionHandler(new ThreadPoolExecutor.CallerRunsPolicy());
         executor.setWaitForTasksToCompleteOnShutdown(true);
         return executor;
     }
 
 }

然后在定时任务这里注入进去:

 @Slf4j
 @Component
 @EnableScheduling
 public class ScheduleService {
 
     @Autowired
     TaskExecutor taskExecutor;
 
     @Scheduled(cron = "0/5 * * * * ? ")
     public void testSchedule() {
         CompletableFuture.runAsync(()->{
             try {
                 Thread.sleep(10000);
                 log.info("当前执行任务的线程号ID===>{}", Thread.currentThread().getId());
             } catch (Exception e) {
                 e.printStackTrace();
             } 
         },taskExecutor);
     }
 }

2.2、将定时任务加上异步注解@Async,将其改为异步的定时任务,另外自定义一个系统通用的线程池,让异步任务使用该线程执行任务~

异步定时任务其实和上面的方式原理是一样的,不过实现稍稍不同罢了。

在定时任务的类上再加一个@EnableAsync注解,给方法添加一个@Async即可。

不过一般@Async都会指定线程池,比如写成这样@Async(value = "taskExecutor"),

 @Slf4j
 @Component
 @EnableAsync
 @EnableScheduling
 public class ScheduleService {
 
     @Autowired
     TaskExecutor taskExecutor;
 
     @Async(value = "taskExecutor")
     @Scheduled(cron = "0/5 * * * * ? ")
     public void testSchedule() {
             try {
                 Thread.sleep(10000);
                 log.info("当前执行任务的线程号ID===>{}", Thread.currentThread().getId());
             } catch (Exception e) {
                 e.printStackTrace();
             } 
     }
 }

 

标签:异步,自定义,Schedule,任务,线程,executor,Async,public
From: https://www.cnblogs.com/jiutang001/p/18329474

相关文章

  • 2024-07-29 如何判断自定义组件中的slot是否被传入值==》defineSlots或this.$slots
    假如你的自定义组件是这样:<template><div><button:class="`btn-${type}`"><slot></slot></button></div></template><script>exportdefault{name:"tButt......
  • ros2 自定义一个控制器
    在ROS2中,自定义一个控制器并进行使用涉及几个步骤,包括编写控制器代码、配置控制器参数、编写控制器启动文件以及在运行时加载和使用控制器。以下是一个详细的步骤指南:1.编写控制器代码首先,创建一个控制器类,该类继承自controller_interface::ControllerInterface。下面是一......
  • 自定义异常 - 捕获不继承自 BaseException 的类
    我正在尝试编写一些自定义异常处理,但不断遇到“TypeError:不允许捕获不从BaseException继承的类”错误的问题。我有一个名为NodeError的异常基类,它继承自Exception。从那里,我有几个继承自NodeError的自定义异常。web3模块使用requests模块与节点进行通信。我......
  • 上手多线程(Java)用多线程,就能让图画动起来!
    多线程的三个关键:1.继承Thread类,重写run方法2.线程工作代码在run方法中写3.启动时,调用线程对象的start()如下,教大家实现一个简单的多线程项目一.首先写好一个界面,创建一个按钮对象并加入监听点击按钮后会启动一个新的线程ThreadDraw来进行绘图操作......
  • SQL Server数据库的黑匣子:实现自定义日志记录
    SQLServer数据库的黑匣子:实现自定义日志记录在数据库管理中,日志记录是监控和审计数据库活动的重要手段。SQLServer提供了多种日志记录机制,但有时这些默认的日志记录可能无法满足特定的业务需求。在这种情况下,实现数据库的自定义日志记录就显得尤为重要。本文将详细介绍如......
  • 【QT】QT 系统相关(事件、文件、多线程、网络、音视频)
    一、Qt事件1、事件介绍事件是应用程序内部或者外部产生的事情或者动作的统称。在Qt中使用一个对象来表示一个事件。所有的Qt事件均继承于抽象类QEvent。事件是由系统或者Qt平台本身在不同的时刻发出的。当用户按下鼠标、敲下键盘,或者是窗口需要重新绘制的时候,都会发......
  • pytorch中自定义onnx新算子并导出为onnx
    importtorchfromtorch.autogradimportFunctionimporttorch.onnx#Step1:DefinecustomPyTorchoperatorclassMyCustomOp(Function):@staticmethoddefforward(ctx,input):returninput+1@staticmethoddefsymbolic(g,input):......
  • Telegram API 禁止更改用户的自定义标题
    问题:我使用了FSMTelegramBot,最终机器人将聊天用户更改为聊天管理员并更改了管理员的自定义标题。但我在更改自定义标题时遇到问题,这是控制台输出:ERROR:aiogram.event:Causeexceptionwhileprocessupdateid=XXXXXXXXbybotid=XXXXXXXXTelegramBadRequest:Telegramse......
  • iOS基础---多线程:GCD、NSThread、NSOperation
    系列文章目录iOS基础—多线程:GCD、NSThread、NSOperationiOS基础—CategoryvsExtension文章目录系列文章目录一、GCD1.GCD的任务、函数、队列a.任务b.函数c.队列2.GCD的使用a.同步函数+并发队列b.异步函数+并发队列c.同步函数+串行队列d.异步函数+串行队列e.同步函......
  • Java 多线程技术详解
    文章目录Java多线程技术详解目录引言多线程的概念为什么使用多线程?多线程的特征多线程的挑战多线程的实现方式3.1继承`Thread`类示例代码:3.2实现`Runnable`接口示例代码:3.3使用`Executor`框架示例代码:3.4使用`Callable`和`Future`示例代码:线程的生命......