跳到主內容

【SpringBoot】@Scheduled 定時執行

在Spring Boot中,我们可以使用注释@Scheduled来定时执行方法。该注释可用于将方法标记为需要定期执行的方法,并提供执行计划。

@Scheduled注释支持以下属性:

1. fixedRate:以毫秒为单位的执行速率。
2. fixedDelay:以毫秒为单位的执行延迟,即上一次执行结束后的延迟时间。
3. initialDelay:第一次执行的延迟时间,以毫秒为单位。
4. cron:CRON表达式,用于更高级的定时计划。

下面是一个简单的示例,该示例演示如何使用@Scheduled注释在Spring Boot中定期执行方法:

 

import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

@Component
public class MyTask {

@Scheduled(fixedRate = 5000)
public void printMessage() {
System.out.println("Hello, world!");
}
}

在上述示例中,我们定义了一个名为MyTask的组件,其中包含一个使用@Scheduled注释标记的printMessage方法。此方法将在每隔5秒钟输出一条消息"Hello, world!"。

我们还可以使用fixedDelay属性来延迟执行。例如,如果我们将fixedDelay设置为10000,那么该方法将在上一次执行结束后等待10秒才能开始下一次执行。

@Scheduled注释还支持CRON表达式,这使得我们可以更高级地安排任务。例如,如果我们想要在每天早上6点执行任务,我们可以使用以下CRON表达式:

0 0 6 * * *

在此示例中,我们使用六个星号来指定秒,分,时,日,月和星期几。因此,此表达式将在每天早上6点执行任务。


註解停用

如果你想暂时停用@Scheduled注释标记的方法,你可以简单地注释掉它,或者将其标记为禁用,以便稍后重新启用。

要注释掉方法,请将其注释掉:

// @Scheduled(fixedRate = 5000)
public void printMessage() {
    System.out.println("Hello, world!");
}

要禁用方法,您可以使用@Scheduled注释的enabled属性:

// @Scheduled(fixedRate = 5000)
public void printMessage() {
    System.out.println("Hello, world!");
}

在这个例子中,我们使用@Scheduled注释的enabled属性将printMessage方法标记为已禁用。要重新启用该方法,只需将enabled属性设置为true即可。


使用命令停用

是的,您可以使用Spring Boot Actuator的端点来动态启用/禁用定时任务。Spring Boot Actuator是Spring Boot的一个附加模块,提供了很多有用的端点,可以在应用程序运行时监视和管理应用程序。

您需要在项目中添加Actuator依赖项:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

然后,您可以使用`/actuator/scheduledtasks`端点来检查和管理定时任务。要暂时停用定时任务,您可以使用该端点来取消计划的任务。例如:

@Scheduled(fixedRate = 5000, name = "myTask")
public void printMessage() {
    System.out.println("Hello, world!");
}
$ curl -X POST http://localhost:8080/actuator/scheduledtasks/taskName

这将取消计划名为taskName的任务。要重新启用该任务,您可以使用该端点来重新启用任务:

$ curl -X DELETE http://localhost:8080/actuator/scheduledtasks/taskName

 

假设您的Spring Boot应用程序正在运行,并且您已经添加了Actuator依赖项,那么您可以使用以下curl命令向`/actuator/scheduledtasks`端点发出HTTP GET请求来获取当前应用程序中所有定时任务的列表:

curl http://localhost:8080/actuator/scheduledtasks

这将返回一个JSON格式的响应,其中包含有关每个定时任务的信息,例如任务名称、任务是否启用、任务的CRON表达式等。您可以使用该响应来查看应用程序中所有的定时任务信息。

{
  "cron": {
    "myScheduledTask": {
      "scheduled": true,
      "expression": "0/30 * * * * ?"
    }
  },
  "fixedDelay": {},
  "fixedRate": {}
}