一、@Scheduled使用
值写在启动配置文件中,application-dev.yml里
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsIyZuBnLyQjMzQDOxETM1AzMwEjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
1、使用方式1
值直接取得dev里面的值,如果dev里面不配则会报错
@Component
public class BatchRecTaskHandler {
@Scheduled(initialDelay = 0L, fixedRateString = "${fpsMsg.switch.task.recBatchTime}")
public void recBatchRecHandler() {
// 定时任务逻辑
}
}
2、使用方式2
值取得是@Value里面的值,也是取得dev的值,但是dev可以不配,则默认使用值20000L也不报错
@Component
public class BatchRecTaskHandler {
@Value("${fpsMsg.switch.task.recBatchTime:20000L}")
private Long recBatchTime;
private Long processingRecBatchInfCurrentInterval = 0L;
@Scheduled(fixedRate = 1000L)
public void recBatchRecHandler() {
// 不生效,直接结束
if (processingRecBatchInfCurrentInterval < recBatchTime) {
processingRecBatchInfCurrentInterval += 1000L;
return;
}
processingRecBatchInfCurrentInterval = 0L;
// 生效执行定时任务逻辑
}
}
二、定时任务cron存在数据库中
如下图
代码如下(抽象类及实现类)
抽象类
@Configuration
@EnableScheduling
public abstract class AbstractTaskConfig implements SchedulingConfigurer {
private static final Logger logger = LoggerFactory.getLogger(AbstractTaskConfig.class);
@Override
public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {
taskRegistrar.addTriggerTask(//执行定时任务
() -> {
processTask();
}, //设置触发器
triggerContext -> {
// 初始化定时任务周期
CronTrigger trigger = new CronTrigger(getCron());
//CronTrigger trigger = new CronTrigger("* * 1 * * ?");
return trigger.nextExecutionTime(triggerContext);
});
}
/**
* @brief 任务的处理函数
* 本函数需要由派生类根据业务逻辑来实现
*/
protected abstract void processTask();
/**
* @return String
* @brief 获取定时任务周期表达式
* 本函数由派生类实现,从配置文件,数据库等方式获取参数值
*/
abstract String getCron();
}
实现类
@Configuration
public class FpsMsgRecTaskConfig extends AbstractTaskConfig{
private static final Logger logger = LoggerFactory.getLogger(FpsMsgRecTaskConfig.class);
@Override
protected void processTask() {
SimpleDateFormat sd = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
logger.info( " 开始任务"+ ",开始时间:" + sd.format(new Date()));
// TODO: 定时任务的逻辑
logger.info( " 结束任务" + ",结束时间:" + sd.format(new Date()));
}
@Override
String getCron() {
return null;
// 从数据库取合适的定时任务 如取得0 0/1 * * * ?
// return fileTaskInfoDao.get("x").getTaskTimeCrontab();
}
}
核心,取数据库数据: