Java教程

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

本文主要是介绍一文教会你如何使用 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 对任务的支持来安排可运行的任务。

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

这篇关于一文教会你如何使用 Spring TaskScheduler 任务调度器的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!