Spring Boot 如何通过配置文件开启/关闭定时任务
如何使用定时任务
在spring boot中如果需要使用定时任务的话,使用一个注解即可搞定 @Scheduled
- 在启动类上或者配置类上加上 @EnableScheduling
@Configuration
@Slf4j
@EnableScheduling
public class TransactionJob {
}
- 在需要使用定时任务的方法上加 @Scheduled 注解,使用cro表达式指定执行时间
// 秒/分/时/日/月/星期
@Scheduled(cron = "0 0 0 0 0 0")
public void readS3FileJob() {
}
如何控制定时任务执行时间
如上,如果定时任务执行时间在代码里面写死的话,那么当时间发生变更时,我们需要去更改相关代码,很麻烦,那么,可不可我们去通过修改配置文件的相关参数来控制定时任务执行时间呢,答案是可以的,将cron表达式中的内容替换成如下即可。
// 秒/分/时/日/月/星期
@Scheduled(cron = "${timjob.readS3FileJob.time}") //timjob.readS3FileJob.time是配置文件中定义的参数
public void readS3FileJob() {
}
或者如下写法:
final String jobTime = "${timjob.readS3FileJob.time}";// 必须将变量定义为常量,否则会报错
// 秒/分/时/日/月/星期
@Scheduled(cron = jobTime)
public void readS3FileJob() {
}
如何 开启/关闭 定时任务
如上,我们可以随意的更改配置文件的参数来控制定时任务执行时间,那么,我们可不可以也通过修改配置文件来控制是否让其执行呢,答案也是可以的。
- 通过springboot条件注解来控制定时任务是否执行
我们通过@ConditionalOnProperty注解,将其加载对应的定时任务类中,就可以根据配置文件中对应的属于来选择是否加载此类,从而控制类中的定时任务是否执行
//@ConditionalOnProperty(prefix = "timeJod",name = "declare",switch = "on")
public class TransactionJob {
}
- 通过再新增一个属性来控制定时任务是否执行
上面是通过控制整个类来选择定时任务是否执行,这样做的坏处就是,假如类中有多个定时任务,那么如果类没有加载的话,这些定时任务都会被关闭,所以我们可以通过新增一个属性来控制具体的定时任务代码,做法如下:
@value("${timjob.readS3FileJob.swith}") //timjob.readS3FileJob.swith是配置文件中定义的参数
String swith;
// 秒/分/时/日/月/星期
@Scheduled(cron = "${timjob.readS3FileJob.time}") //timjob.readS3FileJob.time是配置文件中定义的参数
public void readS3FileJob() {
if("on".equals(swith)){
//执行对应的定时任务代码
}
}
-
第二种方式虽然可以做到对定时任务进行具体的控制,但是还是避免不了定时任务执行,只是相应的代码逻辑没走而已,那么有没有直接可以控制具体的定时任务是否执行,而且不用新增属性呢,答案是有的。SpringBoot2.1以后为我们提供了一种新的模式对定时任务进行控制。如下,再次对corn表达式进行改写。
// 秒/分/时/日/月/星期 @Scheduled(cron = "${timjob.readS3FileJob.time:-}") //timjob.readS3FileJob.time是配置文件中定义的参数 public void readS3FileJob() { }
“-” 表示定时任务不会执行,如果${}对应的参数再配置文件中没有的话,springboot默认会使用-进行填充,即,cron=“-” 表示关闭定时任务。
通过这种方式我们就可以修改对应参数来控制定时任务执行时间,也可以通过注释掉对应的参数来关闭定时任务,非常方便。