版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wild46cat/article/details/82709996
最近遇到这样的需求,要求是定时的执行任务,但是这些任务能够根据控制及时的停止。
首先定时任务可以直接使用spring中的schedule注解方式实现。那么如何控制已经启动的任务及时停止呢?
下面说一下思路。首先利用spring的schedule注解方式进行定时任务的执行。然后,在每个定时任务中使用新建线程的方式进行任务的执行。在新建线程的run方法中通过检测开关的状态,如果开关开启,则抛出interruptException然后通过catch捕获结束线程的执行即可。
下面是详细的实现。
1、首先在spring boot中添加定时任务。
添加@EnableScheduling注解。
2、添加定时任务
package com.example.demo.task;
import com.example.demo.controller.TaskHelperController;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import java.text.SimpleDateFormat;
import java.util.Date;
@Component
public class TestTask {
@Scheduled(cron = "0/5 * * * * ?")
public void test() {
Thread thread = new Thread(new Exetask());
thread.start();
System.out.println(thread.getName() + "===============begin" + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
}
class Exetask implements Runnable {
@Override
public void run() {
for (int i = 0; i < 100; i++) {
try {
if (TaskHelperController.stopFlag) {
throw new InterruptedException();
}
Thread.sleep(3000);
System.out.println(Thread.currentThread().getName() + " " + new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS").format(new Date()));
} catch (InterruptedException e) {
System.out.println(Thread.currentThread().getName() + " stop!!!");
break;
}
}
}
}
}
3、对应的控制逻辑在另一个接口中
package com.example.demo.controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
@RequestMapping("/taskHelper")
public class TaskHelperController {
public static boolean stopFlag = false;
@RequestMapping("/change")
public String test(boolean flag) {
TaskHelperController.stopFlag = flag;
return "ok";
}
}
4、这里的开关标志可以保存在数据库,缓存等地方。