一文教会你如何使用 Spring TaskScheduler 任务调度器
2022/10/18 4:24:58
本文主要是介绍一文教会你如何使用 Spring TaskScheduler 任务调度器,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
- 概述
在本教程中,我们将讨论 Spring 任务调度机制, TaskScheduler, 以及它的预构建实现。然后我们将探索要使用的不同触发器。
Spring 3.0 引入了TaskScheduler,其中包含多个可以配置在未来某个时间点运行的方法。 TaskScheduler 还返回 ScheduledFuture 接口的表示对象,我们可以使用它来取消计划任务并检查它们是否已完成。
我们需要做的就是选择一个可运行的任务进行调度,然后选择一个合适的调度策略。
- ThreadPoolTaskScheduler
ThreadPoolTaskScheduler 对于内部线程管理很有用,因为它将任务委托给 ScheduledExecutorService 并实现 TaskExecutor 接口。它的单个实例能够处理异步潜在执行,以及 @Scheduled 注释。
让我们在 ThreadPoolTaskSchedulerConfig 中定义 ThreadPoolTaskScheduler bean:
@Configuration @ComponentScan( basePackages="com.baeldung.taskscheduler", basePackageClasses={ThreadPoolTaskSchedulerExamples.class}) public class ThreadPoolTaskSchedulerConfig { @Bean public ThreadPoolTaskScheduler threadPoolTaskScheduler(){ ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); threadPoolTaskScheduler.setPoolSize(5); threadPoolTaskScheduler.setThreadNamePrefix( "ThreadPoolTaskScheduler"); return threadPoolTaskScheduler; } }
配置的 bean threadPoolTaskScheduler 可以根据配置的池大小 5 异步执行任务。
请注意,所有与 ThreadPoolTaskScheduler 相关的线程名称都将以 ThreadPoolTaskScheduler 为前缀。
让我们实现一个简单的任务,然后我们可以安排:
class RunnableTask implements Runnable{ private String message; public RunnableTask(String message){ this.message = message; } @Override public void run() { System.out.println(new Date()+" Runnable Task with "+message +" on thread "+Thread.currentThread().getName()); } }
我们现在可以调度调度器来执行这个任务:
taskScheduler.schedule( new Runnabletask("Specific time, 3 Seconds from now"), new Date(System.currentTimeMillis + 3000) );
taskScheduler 将把这个可运行的任务安排在一个已知的日期,即当前时间之后的 3 秒。
现在让我们更深入地了解ThreadPoolTaskScheduler调度机制。
- 以固定延迟安排可运行任务
我们可以使用两种简单的机制来安排固定延迟:
3.1 在最后一次计划执行的固定延迟后执行
让我们配置一个任务在 1000 毫秒的固定延迟后运行:
taskScheduler.scheduleWithFixedDelay( new RunnableTask("Fixed 1 second Delay"), 1000);
RunnableTask 将始终在一次执行完成和下一次执行开始之间运行 1000 毫秒。
3.2 在特定日期的固定延迟后执行
让我们将任务配置为在给定开始时间的固定延迟后运行:
taskScheduler.scheduleWithFixedDelay( new RunnableTask("Current Date Fixed 1 second Delay"), new Date(), 1000);
RunnableTask 将在指定的执行时间被调用,其中包括 @PostConstruct 方法开始的时间,随后延迟 1000 毫秒。
- 以固定速率调度
有两种简单的机制可以以固定速率调度可运行任务。
4.1 以固定速率调度 RunnableTask
让我们安排一个任务以固定的毫秒速率运行:
taskScheduler.scheduleAtFixedRate( new RunnableTask("Fixed Rate of 2 seconds") , 2000);
下一个 RunnableTask 将始终在 2000 毫秒后运行,而不管上次执行的状态如何,它可能仍在运行。
4.2 从给定日期以固定速率调度 RunnableTask
taskScheduler.scheduleAtFixedRate( new RunnableTask("Fixed Rate of 2 seconds") , 2000);
RunnableTask 将在当前时间后 3000 毫秒运行。
- 使用 CronTrigger 进行调度
我们使用CronTrigger 来根据 cron 表达式调度任务:
taskScheduler.scheduleAtFixedRate(new RunnableTask( "Fixed Rate of 2 seconds"), new Date(), 3000);
我们可以使用提供的触发器按照某个指定的节奏或时间表运行任务:
taskScheduler.schedule(new RunnableTask("Cron Trigger"), cronTrigger);
在这种情况下,RunnableTask 将在每分钟的第 10 秒执行。
- 使用 PeriodicTrigger 进行调度
让我们使用 PeriodicTrigger 以 2000 毫秒的固定延迟调度任务:
PeriodicTrigger periodicTrigger = new PeriodicTrigger(2000, TimeUnit.MICROSECONDS);
配置的 PeriodicTrigger bean 用于在 2000 毫秒的固定延迟后运行任务。
现在让我们用 PeriodicTrigger 安排 RunnableTask:
taskScheduler.schedule( new RunnableTask("Periodic Trigger"), periodicTrigger);
我们还可以配置 PeriodicTrigger 以固定速率初始化,而不是固定延迟。此外,我们可以为第一个计划任务设置一个给定毫秒的初始延迟。
我们需要做的就是在 periodicTrigger bean 的 return 语句之前添加两行代码**:**
periodicTrigger.setFixedRate(true); periodicTrigger.setInitialDelay(1000);
我们使用 setFixedRate 方法以固定速率而不是固定延迟来调度任务。然后我们使用 setInitialDelay 方法设置第一个可运行任务运行的初始延迟。
- 结论
在这篇简短的文章中,我们学习了如何使用 Spring 对任务的支持来安排可运行的任务。
我们演示了以固定延迟、固定速率并根据指定触发器运行任务。
这篇关于一文教会你如何使用 Spring TaskScheduler 任务调度器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)
- 2024-05-30【Java】百万数据excel导出功能如何实现
- 2024-05-30我们小公司,哪像华为一样,用得上IPD(集成产品开发)?
- 2024-05-30java excel上传--poi
- 2024-05-30安装笔记本应用商店的pycharm,再安排pandas等模块,说是没有打包工具?
- 2024-05-29java11新特性
- 2024-05-29哪些无用敏捷指标正在破坏敏捷转型?
- 2024-05-29鸿蒙原生应用再新丁!新华社 入局鸿蒙
- 2024-05-29设计模式 之 迭代器模式(Iterator)