我们都知道定时任务写好后,正常来讲没办法控制他是否执行。除非你在代码里直接return。这种方式只是说不执行任务内容,但是定时任务还是会运行的。
@Scheduled(initialDelay = 1000, fixedDelay = 3000)
public void task2(){
System.out.println("task2 start at:"+ LocalDateTime.now());
}
啊..那就没有办法限制了吗?当然不是!
方式一:@Conditional
通过定义@Conditional来控制是否加入到Spring容器。
@Configuration
@EnableScheduling
@Conditional(MyCondition.class)
public class ScheduleConfig {
//..
条件类:
public class MyCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
//写你的条件
return true; // 返回true则加载定时任务
}
//..
方式二:编程方式
通过手动注册任务定时,能够很轻松的控制启动时是否开启定时任务。
@Configuration
@EnableScheduling
publicclass ScheduleConfig {
@Autowired
private TaskScheduler taskScheduler; // 注入已配置的scheduler
private ScheduledFuture<?> scheduledFuture; // 用于存储任务引用
@PostConstruct
public void init() {
if (checkBusinessCondition()) { // 满足条件时注册任务
scheduledFuture = taskScheduler.schedule(
() -> new MyJob().execute(),
new CronTrigger("0/30 * * * * ?")
);
}
}
private boolean checkBusinessCondition() {
// 你的业务条件判断逻辑
return yourBusinessService.isTaskEnabled();
}
// 可添加接口动态启停任务
public void stopTask() {
if (scheduledFuture != null) {
scheduledFuture.cancel(true);
}
}
}
总的来说还是推荐第一种方式,比较方便。