springboot ThreadPoolTaskScheduler 完整demo
时间: 2023-07-06 12:34:28 浏览: 84
下面是一个完整的 Spring Boot 应用程序示例,演示如何使用 ThreadPoolTaskScheduler 来创建一个定时任务并获取其执行状态:
```
@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Autowired
private MyScheduledTask myScheduledTask;
@Override
public void run(String... args) throws Exception {
// 等待定时任务执行完成
while (myScheduledTask.isRunning()) {
Thread.sleep(1000L);
}
System.out.println("Scheduled task has completed.");
}
@Component
public static class MyScheduledTask {
private ScheduledFuture<?> scheduledFuture;
@Autowired
private ThreadPoolTaskScheduler taskScheduler;
@PostConstruct
public void init() {
scheduledFuture = taskScheduler.schedule(this::runTask, new CronTrigger("0/5 * * * * ?"));
}
private void runTask() {
System.out.println("Scheduled task is running...");
}
public boolean isRunning() {
return scheduledFuture != null && !scheduledFuture.isCancelled() && !scheduledFuture.isDone();
}
}
}
```
在上面的代码中,我们创建了一个名为 MyScheduledTask 的组件,并使用 ThreadPoolTaskScheduler 来创建定时任务。在 init 方法中,我们使用 schedule 方法来创建任务,并将返回的 ScheduledFuture 对象保存在 scheduledFuture 变量中。在 isRunning 方法中,我们检查 scheduledFuture 对象是否存在且未被取消或已完成,以判断定时任务是否正在执行。
在 Spring Boot 应用程序的 CommandLineRunner 中,我们等待定时任务执行完成后输出一条消息。这里我们使用了 while 循环来等待任务执行完成,这是一种比较简单的方式,实际应用中可能需要使用更加高级的同步机制来实现。
需要注意的是,为了能够在 CommandLineRunner 中获取 MyScheduledTask 组件的实例,我们将其定义为了一个静态内部类。在实际应用中,我们可以将其定义为一个独立的类,并通过依赖注入的方式来获取其实例。
阅读全文