阅读(283) (0)

Micronaut 计划任务

2023-02-23 11:12:47 更新

与 Spring 和 Grails 一样,Micronaut 具有用于调度后台任务的 Scheduled 注解。

使用@Scheduled 注解

Scheduled 注释可以添加到 bean 的任何方法,您应该设置 fixedRate、fixedDelay 或 cron 成员之一。

请记住,bean 的范围会影响行为。每次执行计划的方法时,@Singleton bean 共享状态(实例的字段),而对于 @Prototype bean,每次执行都会创建一个新实例。

以固定速率调度

要以固定速率安排任务,请使用 fixedRate 成员。例如:

固定利率示例

 Java Groovy  Kotlin 
@Scheduled(fixedRate = "5m")
void everyFiveMinutes() {
    System.out.println("Executing everyFiveMinutes()");
}
@Scheduled(fixedRate = "5m")
void everyFiveMinutes() {
    println "Executing everyFiveMinutes()"
}
@Scheduled(fixedRate = "5m")
internal fun everyFiveMinutes() {
    println("Executing everyFiveMinutes()")
}

上面的任务每五分钟执行一次。

固定延迟调度

要安排任务使其在前一个任务终止后五分钟运行,请使用 fixedDelay 成员。例如:

固定延迟示例

 Java Groovy  Kotlin 
@Scheduled(fixedDelay = "5m")
void fiveMinutesAfterLastExecution() {
    System.out.println("Executing fiveMinutesAfterLastExecution()");
}
@Scheduled(fixedDelay = "5m")
void fiveMinutesAfterLastExecution() {
    println "Executing fiveMinutesAfterLastExecution()"
}
@Scheduled(fixedDelay = "5m")
internal fun fiveMinutesAfterLastExecution() {
    println("Executing fiveMinutesAfterLastExecution()")
}

安排 Cron 任务

要安排 Cron 任务,请使用 cron 成员:

计划实例

 Java Groovy  Kotlin 
@Scheduled(cron = "0 15 10 ? * MON")
void everyMondayAtTenFifteenAm() {
    System.out.println("Executing everyMondayAtTenFifteenAm()");
}
@Scheduled(cron = "0 15 10 ? * MON")
void everyMondayAtTenFifteenAm() {
    println "Executing everyMondayAtTenFifteenAm()"
}
@Scheduled(cron = "0 15 10 ? * MON")
internal fun everyMondayAtTenFifteenAm() {
    println("Executing everyMondayAtTenFifteenAm()")
}

上面的示例在服务器时区的每周一上午 10:15 运行任务。

仅具有初始延迟的调度

要安排任务使其在服务器启动后运行一次,请使用 initialDelay 成员:

初始延迟示例

 Java Groovy  Kotlin 
@Scheduled(initialDelay = "1m")
void onceOneMinuteAfterStartup() {
    System.out.println("Executing onceOneMinuteAfterStartup()");
}
@Scheduled(initialDelay = "1m")
void onceOneMinuteAfterStartup() {
    println "Executing onceOneMinuteAfterStartup()"
}
@Scheduled(initialDelay = "1m")
internal fun onceOneMinuteAfterStartup() {
    println("Executing onceOneMinuteAfterStartup()")
}

上面的例子只运行一次,在服务器启动后一分钟。

以编程方式安排任务

要以编程方式安排任务,请使用可以按如下方式注入的 TaskScheduler bean:

 Java Groovy  Kotlin 
@Inject
@Named(TaskExecutors.SCHEDULED)
TaskScheduler taskScheduler;
@Inject
@Named(TaskExecutors.SCHEDULED)
TaskScheduler taskScheduler
@Inject
@Named(TaskExecutors.SCHEDULED)
lateinit var taskScheduler: TaskScheduler

使用注释元数据配置计划任务

要使您的应用程序的任务可配置,您可以使用注释元数据和属性占位符配置。例如:

允许配置任务

 Java Groovy  Kotlin 
@Scheduled(fixedRate = "${my.task.rate:5m}",
        initialDelay = "${my.task.delay:1m}")
void configuredTask() {
    System.out.println("Executing configuredTask()");
}
@Scheduled(fixedRate = '${my.task.rate:5m}',
        initialDelay = '${my.task.delay:1m}')
void configuredTask() {
    println "Executing configuredTask()"
}
@Scheduled(fixedRate = "\${my.task.rate:5m}",
        initialDelay = "\${my.task.delay:1m}")
internal fun configuredTask() {
    println("Executing configuredTask()")
}

上面的示例允许使用属性 my.task.rate 配置任务执行频率,并使用属性 my.task.delay 配置初始延迟。

配置定时任务线程池

@Scheduled 执行的任务默认在 ScheduledExecutorService 上运行,该服务配置为具有两倍于可用处理器的线程数。

您可以在您的配置文件(例如 application.yml)中配置此线程池:

配置定时任务线程池

 Properties Yaml  Toml  Groovy  Hocon  JSON 
micronaut.executors.scheduled.type=scheduled
micronaut.executors.scheduled.core-pool-size=30
micronaut:
  executors:
    scheduled:
      type: scheduled
      core-pool-size: 30
[micronaut]
  [micronaut.executors]
    [micronaut.executors.scheduled]
      type="scheduled"
      core-pool-size=30
micronaut {
  executors {
    scheduled {
      type = "scheduled"
      corePoolSize = 30
    }
  }
}
{
  micronaut {
    executors {
      scheduled {
        type = "scheduled"
        core-pool-size = 30
      }
    }
  }
}
{
  "micronaut": {
    "executors": {
      "scheduled": {
        "type": "scheduled",
        "core-pool-size": 30
      }
    }
  }
}
表 1. UserExecutorConfiguration 的配置属性
属性 类型 描述

micronaut.executors.*.n-threads

java.lang.Integer

micronaut.executors.*.type

ExecutorType

micronaut.executors.*.parallelism

java.lang.Integer

micronaut.executors.*.core-pool-size

java.lang.Integer

micronaut.executors.*.thread-factory-class

java.lang.Class

micronaut.executors.*.name

java.lang.String

设置执行者名称。

micronaut.executors.*.number-of-threads

java.lang.Integer

设置 FIXED 的线程数。默认值(2 * Java 虚拟机可用的处理器数)。

处理异常

默认情况下,Micronaut 包含一个 DefaultTaskExceptionHandler bean,它实现了 TaskExceptionHandler 接口,如果调用计划任务时发生错误,则只记录异常。

如果您有自定义要求,您可以用您自己的实现替换此 bean(例如发送电子邮件或关闭上下文以快速失败)。为此,请编写您自己的 TaskExceptionHandler 并使用 @Replaces(DefaultTaskExceptionHandler.class) 对其进行注释。