动态的获取corn表达式,执行定时任务,可从数据库读取
/**
* 动态的获取corn表达式,执行业务
*/
@Component
@EnableScheduling
public class DynamicCronSchedule implements SchedulingConfigurer {
private static Logger logger = LoggerFactory.getLogger(DynamicCronSchedule.class);
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
Runnable task = new Runnable() {
@Override
public void run() {
//业务执行代码
System.out.println("动态corn");
}
};
Trigger trigger = new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
//执行于每一次任务的触发,可以动态的得到执行的时间周期
String cron = "*/3 * * * * ?";
logger.info("cron expression is [{}]",cron);
logger.info("trigger list size is [{}]",taskRegistrar.getTriggerTaskList().size());
CronTrigger cronTrigger = new CronTrigger(cron);
Date nextExecTime = cronTrigger.nextExecutionTime(triggerContext);
return nextExecTime;
}
};
taskRegistrar.addTriggerTask(task, trigger);
}
}
测试
/**
* 动态的获取corn表达式,执行业务
*/
@Component
@EnableScheduling
public class DynamicCronSchedule implements SchedulingConfigurer {
private static Logger logger = LoggerFactory.getLogger(DynamicCronSchedule.class);
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
Runnable task = new Runnable() {
@Override
public void run() {
//业务执行代码
System.out.println("执行业务。。。。。。");
}
};
Trigger trigger = new Trigger() {
@Override
public Date nextExecutionTime(TriggerContext triggerContext) {
//执行于每一次任务的触发,可以动态的得到执行的时间周期
String cron = "*/3 * * * * ?";
String corn1 = "*/6 * * * * ?";
//随机执行一种表达式
if (new Random().nextInt(10) % 2 == 0) {
CronTrigger cronTrigger = new CronTrigger(cron);
Date nextExecTime = cronTrigger.nextExecutionTime(triggerContext);
System.out.println("*/3 * * * * ? --> 执行了" );
return nextExecTime;
} else {
CronTrigger cronTrigger = new CronTrigger(corn1);
Date nextExecTime = cronTrigger.nextExecutionTime(triggerContext);
System.out.println("*/6 * * * * ? --> 执行了" );
return nextExecTime;
}
}
};
taskRegistrar.addTriggerTask(task, trigger);
}
}
执行结果:每次执行前都回去加载一次定义的corn规则
另外(看到了,记录一下)
-
可以把Scheduled写到xml文件中进行配置。
-
@Scheduled(cron=“0/5 * * * * ? “) 改为 @Scheduled(cron=”${”${jobs.schedule}") }") ,然后在配置文件中读取jobs.schedule=0/5 * * * * ?
原文链接:https://blog.csdn.net/weixin_37198522/article/details/84568272