一文教会你如何使用 Spring TaskScheduler 任务调度器

  1. 概述

在本教程中,我们将讨论 Spring 任务调度机制, TaskScheduler, 以及它的预构建实现。然后我们将探索要使用的不同触发器。

Spring 3.0 引入了TaskScheduler*,其中包含多个可以配置在未来某个时间点运行的方法。 *TaskScheduler 还返回 ScheduledFuture 接口的表示对象,我们可以使用它来取消计划任务并检查它们是否已完成。

我们需要做的就是选择一个可运行的任务进行调度,然后选择一个合适的调度策略。

  1. 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调度机制。

  1. 以固定延迟安排可运行任务

我们可以使用两种简单的机制来安排固定延迟:

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 毫秒。

  1. 以固定速率调度

有两种简单的机制可以以固定速率调度可运行任务。

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 毫秒运行。

  1. 使用 CronTrigger 进行调度

我们使用CronTrigger 来根据 cron 表达式调度任务:

taskScheduler.scheduleAtFixedRate(new RunnableTask(
  "Fixed Rate of 2 seconds"), new Date(), 3000);

我们可以使用提供的触发器按照某个指定的节奏或时间表运行任务:

taskScheduler.schedule(new RunnableTask("Cron Trigger"), cronTrigger);

在这种情况下,RunnableTask 将在每分钟的第 10 秒执行。

  1. 使用 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 方法设置第一个可运行任务运行的初始延迟。

  1. 结论

在这篇简短的文章中,我们学习了如何使用 Spring 对任务的支持来安排可运行的任务。

我们演示了以固定延迟、固定速率并根据指定触发器运行任务。

本文代码可以在 GitHub 找到。

本文亦通过 NoOne 的个人博客 发表。

这句话的作用是使用 TaskScheduler 定时调度任务,使得任务能够按照固定的时间间隔进行执行。其中,task 是需要执行的任务,500 是时间间隔,表示每隔 500 毫秒执行一次任务。 TaskScheduler 是一个可以进行任务调度的类,它是 Spring 框架中的一个组件,可以用于在应用程序中进行任务调度TaskScheduler 可以用来执行一些周期性的任务,并且可以控制任务的执行时间和频率。在 Spring Boot 应用程序中,可以使用 @EnableScheduling 注解来开启任务调度,然后使用 @Scheduled 注解来指定任务的执行时间和频率。 需要注意的是,TaskScheduler 不是一个线程,它只是一个用于任务调度的类。实际上,TaskScheduler 可以使用多个线程来执行任务,具体线程的数量和执行方式可以通过配置来进行调整。 例子代码如下: ``` @Service public class MyService { @Autowired private TaskScheduler taskScheduler; public void startTask() { taskScheduler.scheduleAtFixedRate(new MyTask(), 500); } } public class MyTask implements Runnable { public void run() { // 执行任务的代码 } } ``` 在这个例子中,我们使用 TaskScheduler 来执行 MyTask 中的任务。在 MyService 中,我们注入了 TaskScheduler,并使用 scheduleAtFixedRate() 方法来指定任务的执行时间和频率。在 MyTask 中,我们实现了 Runnable 接口,并在 run() 方法中编写了具体的任务代码。这样,当 startTask() 方法被调用时,就会使用 TaskScheduler 来定期执行 MyTask 中的任务。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值