# 【SpringBoot】@Scheduled 定時執行

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

@Scheduled注释支持以下属性：

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

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

```Java
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注释标记的方法，你可以简单地注释掉它，或者将其标记为禁用，以便稍后重新启用。

要注释掉方法，请将其注释掉：

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

```

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

```Java
// @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依赖项：

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

```

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

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

```

```shell
$ curl -X POST http://localhost:8080/actuator/scheduledtasks/taskName
```

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

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

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

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

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

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

```