Micronaut 計(jì)劃任務(wù)

2023-03-02 15:04 更新

與 Spring 和 Grails 一樣,Micronaut 具有用于調(diào)度后臺(tái)任務(wù)的 Scheduled 注解。

使用@Scheduled 注解

Scheduled 注釋可以添加到 bean 的任何方法,您應(yīng)該設(shè)置 fixedRate、fixedDelay 或 cron 成員之一。

請(qǐng)記住,bean 的范圍會(huì)影響行為。每次執(zhí)行計(jì)劃的方法時(shí),@Singleton bean 共享狀態(tài)(實(shí)例的字段),而對(duì)于 @Prototype bean,每次執(zhí)行都會(huì)創(chuàng)建一個(gè)新實(shí)例。

以固定速率調(diào)度

要以固定速率安排任務(wù),請(qǐng)使用 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()")
}

上面的任務(wù)每五分鐘執(zhí)行一次。

固定延遲調(diào)度

要安排任務(wù)使其在前一個(gè)任務(wù)終止后五分鐘運(yùn)行,請(qǐng)使用 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 任務(wù)

要安排 Cron 任務(wù),請(qǐng)使用 cron 成員:

計(jì)劃實(shí)例

 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()")
}

上面的示例在服務(wù)器時(shí)區(qū)的每周一上午 10:15 運(yùn)行任務(wù)。

僅具有初始延遲的調(diào)度

要安排任務(wù)使其在服務(wù)器啟動(dòng)后運(yùn)行一次,請(qǐng)使用 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()")
}

上面的例子只運(yùn)行一次,在服務(wù)器啟動(dòng)后一分鐘。

以編程方式安排任務(wù)

要以編程方式安排任務(wù),請(qǐng)使用可以按如下方式注入的 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

使用注釋元數(shù)據(jù)配置計(jì)劃任務(wù)

要使您的應(yīng)用程序的任務(wù)可配置,您可以使用注釋元數(shù)據(jù)和屬性占位符配置。例如:

允許配置任務(wù)

 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 配置任務(wù)執(zhí)行頻率,并使用屬性 my.task.delay 配置初始延遲。

配置定時(shí)任務(wù)線程池

@Scheduled 執(zhí)行的任務(wù)默認(rèn)在 ScheduledExecutorService 上運(yùn)行,該服務(wù)配置為具有兩倍于可用處理器的線程數(shù)。

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

配置定時(shí)任務(wù)線程池

 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

設(shè)置執(zhí)行者名稱。

micronaut.executors.*.number-of-threads

java.lang.Integer

設(shè)置 FIXED 的線程數(shù)。默認(rèn)值(2 * Java 虛擬機(jī)可用的處理器數(shù))。

處理異常

默認(rèn)情況下,Micronaut 包含一個(gè) DefaultTaskExceptionHandler bean,它實(shí)現(xiàn)了 TaskExceptionHandler 接口,如果調(diào)用計(jì)劃任務(wù)時(shí)發(fā)生錯(cuò)誤,則只記錄異常。

如果您有自定義要求,您可以用您自己的實(shí)現(xiàn)替換此 bean(例如發(fā)送電子郵件或關(guān)閉上下文以快速失敗)。為此,請(qǐng)編寫您自己的 TaskExceptionHandler 并使用 @Replaces(DefaultTaskExceptionHandler.class) 對(duì)其進(jìn)行注釋。


以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)