文章目录
- Spring Boot任务调用
- 服务器启动时自动执行某个任务
- 服务器启动后定时自动执行某个任务
- Spring定时任务之@Scheduled cron表达式
- 不使用cron
- 推荐还是使用Cron多功能
- 实际使用场景
Spring Boot任务调用
服务器启动时自动执行某个任务
SpringBoot
提供两种方法,编写一个组件(@Component
)实现ApplicationRunner
或者实现CommandLineRunner
它两重写的run方法参数列表都不怎么用得到
如果有多个任务指定顺序
@Order(1)
注解在组件上就能决定顺序
但是这个标记是Spring的
两种方法实现的接口都是boot的
如何决定多个Filter顺序
由filterName
字典顺序执行
如何指定任务执行顺序
通过使用@Order
注解指定任务执行顺序
我们可以在启动任务时追加数据库等操作
OneTask.java
package vip.javer.task.task;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* Class Describe:
*
* @author biuaxia
* @date 2018/12/14 10:05
*/
@Component
@Order(2)
public class OneTask implements ApplicationRunner {
@Override
public void run(ApplicationArguments args) throws Exception {
System.out.println("****Task===One****");
}
}
TwoTask.java
package vip.javer.task.task;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.boot.CommandLineRunner;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
/**
* Class Describe:
*
* @author biuaxia
* @date 2018/12/14 10:05
*/
@Component
@Order(1)
public class TwoTask implements CommandLineRunner {
@Override
public void run(String... args) throws Exception {
System.out.println("****Task===Two****");
}
}
这里通过设置@Order
修改了顺序,所以2先执行,1后执行
服务器启动后定时自动执行某个任务
以前使用Spring时使用第三方组件quartz
完成类似需求
有机会可以了解一下Spring与Quartz的整合
而在Boot中内置了status
案例:每隔5s
调用任务打印输出当前时间
- 新建Task类
- 自定义方法
- 书写方法逻辑
- 在类上@Component
- 方法上@Scheduled
```
@Scheduled(cron=“0/5 * * * * ?”)
public void exe(){
sout(“自动执行任务3,时间:”+new Date());
}
```
到了这里怎么启动呢?
- 我们在启动类追加
@EnableScheduling
即可
这样就能启动之后每隔5s打印一次
例如到了5s就执行一次
@Scheduled(cron=“5 * * * * ?”)
例如每到29分5s执行一次
@Scheduled(cron=“5 29 * * * ?”)
Spring定时任务之@Scheduled cron表达式
一个cron表达式
至少有6个(也可能7个)有空格分隔的时间元素
按顺序依次为
秒(0-59)
分(0-59)
时(0-23)
天(月)(0-31,但是你需要考虑你月的天数)
月(0-11)
天(星期)(1-7 1=SUN或SUN,MON,TUE,WED,THU,FRI,SAT)
7年份(1970-2099)
字符代表所有可能的值,因此在表达式(月)则表示每月,**在分则表示每分,等。
?字符仅呗用于天(月)和天(星期)两个子表达式,表示不指定值,当两个子表达式其中之一被指定,为了避免冲突需要将另一个子表达式的值设为?
比如有一个为*另一个就是?
**L字符被用于天(月)和天(星期)两个子表达式,它是单词“last”的错写,但在两个子表达式的含义不同 **
- 在天(月)子表达式中,L表示一个月的最后一天
- 在天(星期)子表达式中,L表示一个星期的最后一天,也就是SAT
如果在L前有具体的内容,他就有其他的含义了
例如6L
表示这个月的倒数第六天,F R I L
表示这个月的最后一个星期五
注意,在使用L参数时,不要指定列表或范围,因为这会导致问题
/字符用来指定数值的增量
比如说在子表达式(分钟)里面0/15
就是从第0分钟开始,每15分钟执行一次
再比如子表达式(分钟)里的3/20
表示从第3分钟开始,每20分钟(它和3,23,43的含义一样)执行一次
不使用cron
每隔5000毫秒调用(即5S)@Scheduled(fixedRate=5000)调用一次
@Scheduled(fixedRate=5000,initialDelay=2000)等待2s然后每隔5s调用
推荐还是使用Cron多功能
实际使用场景
- 每日天气预报
- 用户生日发邮件啥的
- 每晚12点汇总账目啥的
如果你使用的Spring版本在3.0以上就可以使用EnableScheduling