Java SchedulingConfigurer来实现定时任务
写这个博客的来记录的由来是,再工作中因为原先都是使用注解的方式来实现定时任务的实现,比如@Scheduled,
首先这个方式比较方便的,但它是静态的,也就是单线程的,所以当有多个任务运行的时候,有可能该定时任务会
受到其他任务的影响,所以我一般在工作中都是使用基于接口实现的定时任务,这是动态的,也就是基于接口SchedulingConfigurer。
废话不多说,直接上代码:
@Configuration
@Component
public class QuestionScheduledTask implements SchedulingConfigurer {
@Resource
private QuestionDao questionDao;
private static Logger logger = LoggerFactory.getLogger(PaperScheduledTask.class);
/**
* 每天早上5点进行这个定时任务
*/
private String cron = "0 0 5 * * ?";
@Transactional(rollbackFor = RuntimeException.class)
@Override
public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) {
scheduledTaskRegistrar.addTriggerTask(() -> {
// 定时任务要执行的内容
logger.info("【-----开始执行定时任务-----】");
/**
* 中间就是写具体的业务逻辑
*/
// 定时任务结束
logger.info("【---------------结束定时任务-------------】");
}, triggerContext -> {
// 定时任务触发,可修改定时任务的执行周期
CronTrigger trigger = new CronTrigger(cron);
return trigger.nextExecutionTime(triggerContext);
});
}
}
另外你还需要了解cron表达式来进行执行周期的确定:
0 * * * * ? 每1分钟触发一次
0 0 * * * ? 每天每1小时触发一次
0 0 10 * * ? 每天10点触发一次
0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
0 30 9 1 * ? 每月1号上午9点半
0 15 10 15 * ? 每月15日上午10:15触发
*/5 * * * * ? 每隔5秒执行一次
0 */1 * * * ? 每隔1分钟执行一次
0 0 5-15 * * ? 每天5-15点整点触发
0 0/3 * * * ? 每三分钟触发一次
0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
0 0 12 ? * WED 表示每个星期三中午12点
0 0 17 ? * TUES,THUR,SAT 每周二、四、六下午五点
0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
0 0 23 L * ? 每月最后一天23点执行一次
0 15 10 L * ? 每月最后一日的上午10:15触发
0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
0 15 10 * * ? 2005 2005年的每天上午10:15触发
0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发