老项目中没有引入xxljob之类的定时任务查询,但是有一个任务需要动态开启和关闭,但是引入中间件需要新部署一下,改动较大。
老项目不想动太多东西就查资料找了这个方法。
注意:启动类加入注解 @EnableScheduling 也可直接写到定时任务的类上
编写getExpression方法内容返回定时任务即可
- getExpression方法返回6位的执行公式 公式生成网站
- 返回值可通过数据库获取,修改时修改数据库即可
- 可通过配置中心获取,如nacos之类的,修改是修改配置中心里面的内容即可
- 可通过redis之类的缓存获取,注意持久化
- 可通过读取本地文件获取,调用http接口获取也可。
- 只要根据项目实际情况用适合自己的获取公式方式即可,只有能保证修改后能读取到最新的数据
triggerTask()方法里面写定时任务要执行的内容
package com.yv.demo.config;
import lombok.extern.slf4j.Slf4j;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.scheduling.annotation.SchedulingConfigurer;
import org.springframework.scheduling.config.ScheduledTaskRegistrar;
import org.springframework.scheduling.support.CronTrigger;
import org.springframework.stereotype.Component;
//@EnableScheduling 需要启动类添加注解
@Component
@Slf4j
public class EnableSchedulingConfig implements SchedulingConfigurer {
/**
* 是否设置了定时任务,如果没有设置或设置错误公式为false
* true:可以解析,执行任务
* false:无法解析,表达式错误(需要维护正确的表达式)或未维护(定时任务未开启或暂时停止)。每分钟会获取一下公式判断是否需要执行
*/
private static boolean cron_suspend = true;
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.addTriggerTask(
() -> {//进行定时任务调用
if (cron_suspend) {
//可执行,进行任务调用
triggerTask();
} else {
log.warn("定时任务已暂停");
}
},
triggerContext -> {//设置定时任务执行公式
try {
String expression = getExpression();
log.info("获取定时公式:[{}]", expression);
if (!cron_suspend) {//当前未执行改为可执行
cron_suspend = true;
}
return new CronTrigger(expression).nextExecutionTime(triggerContext);
} catch (Exception e) {
log.error("获取公式执行失败,将暂停服务,一分钟后重新获取定时任务公式");
cron_suspend = false;
e.printStackTrace();
return new CronTrigger("0 * * * * ?").nextExecutionTime(triggerContext);
}
}
);
}
/**
* 获取定时任务表达式
*
* @return 表达式
*/
String getExpression() {
//连接数据库获取定时任务
return "0 * * * * ?";
}
/**
* 触发任务
*/
void triggerTask() {
try {
//执行任务
String mag = "定时任务执行成功";
log.info("定时任务执行完毕:[{}]", mag);
} catch (Exception e) {
log.error("定时任务执行完毕,结果无法解析(或执行任务异常,可通知开发检查)");
e.printStackTrace();
}
}
}