定时任务
在 Blade 2.0.8
版本之后加入了 cron 表达式来完成定时执行任务的需求。
你只需要在处理任务的方法上添加一个 @Schedule
注解,然后编写 cron 表达式即可。
Blade 的任务系统提供你创建、停止、获取任务列表的 API。
创建一个任务
@Bean
public class SimpleTask {
@Schedule(cron = "* * * * * ?")
public void syncRelate() {
System.out.println("执行一次");
}
}
这样就可以创建一个每秒钟执行一次的定时任务了。此时创建的定时任务名称是 task-0
,
当你没有指定一个任务名称的时候,系统会按照数字顺序从 0
开始为他们命名,如果你想动态的
关闭他们,一定要在 @Schedule
注解上加入 name
来命名它,像这样。
@Bean
public class SimpleTask {
@Schedule(name = "task1", cron = "* * * * * ?")
public void syncRelate() {
System.out.println("执行一次");
}
}
TaskManager
可以通过调用 TaskManager
的静态方法来管理任务,下面是 TaskManager
的API。
getTask(name)
:根据任务名获取一个任务。getTasks()
:获取系统所有任务stopTask(name)
:根据任务名停止一个正在运行的任务
关闭任务的方法是在 Task
内部实现的,每一个任务都会有一个上下文,在前面的创建任务中你看到
每个方法都是没有参数的,Blade 支持你传入一个 TaskContext
类型的参数来操作当前的任务
(可能大多数情况用不到)。
private AtomicInteger run1 = new AtomicInteger();
@Schedule(cron = "* * * * * ?")
public void run1(TaskContext context) {
if (run1.get() == 5) {
context.stop();
return;
}
run1.getAndIncrement();
log.info(LocalDateTime.now() + ": Hello task1. " + Thread.currentThread());
}
像这样可以在某个条件触发的时候关闭一个任务。
常用的 Cron 表达式
*/5 * * * * ?
: 每隔5秒执行一次0 */1 * * * ?
: 每隔1分钟执行一次0 0/5 * * * ?
: 每隔5分钟执行一次0 0 23 * * ?
: 每天23点执行一次0 0 1 * * ?
: 每天凌晨1点执行一次0 0 1 1 * ?
: 每月1号凌晨1点执行一次0 0 23 L * ?
: 每月最后一天23点执行一次0 0 1 ? * L
: 每周星期天凌晨1点实行一次0 26,29,33 * * * ?
: 在26分、29分、33分执行一次0 0 0,13,18,21 * * ?
: 每天的0点、13点、18点、21点都执行一次0 0 12 * * ?
: 每天中午12点触发0 15 10 ? * *
: 每天上午10:15触发0 15 10 * * ?
: 每天上午10:15触发0 15 10 * * ? *
: 每天上午10:15触发0 15 10 * * ? 2005
: 2005年的每天上午10:15触发0 * 14 * * ?
: 在每天下午2点到下午2:59期间的每1分钟触发0 0/5 14 * * ?
: 在每天下午2点到下午2:55期间的每5分钟触发0 0/5 14,18 * * ?
: 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发0 0-5 14 * * ?
: 在每天下午2点到下午2:05期间的每1分钟触发0 10,44 14 ? 3 WED
: 每年三月的星期三的下午2:10和2:44触发0 15 10 ? * MON-FRI
: 周一至周五的上午10:15触发0 15 10 15 * ?
: 每月15日上午10:15触发0 15 10 L * ?
: 每月最后一日的上午10:15触发0 15 10 ? * 6L
: 每月的最后一个星期五上午10:15触发0 15 10 ? * 6L 2002-2005
: 2002年至2005年的每月的最后一个星期五上午10:15触发0 15 10 ? * 6#3
: 每月的第三个星期五上午10:15触发0 15 10 ? * 6#3
: 每月的第三个星期五上午10:15触发