spring boot定时任务总结和实现

介绍

定时任务是程序开发中重要且不可缺少的功能,它会自动按照设定好的时间规则,按时完成执行任务,一般周期性更新数据状态,闲时缓存数据,执行计划任务。
本次主要介绍spring scheduled

种类

  • 定时任务调度的,一般有3种。
    • Timer:java自带定时任务类,单线程执行,适合轻度
    • scheduled:spring 官方定时任务调度,配置简单,支持多线程,通过注解设置,支持cron时间格式。
    • quartz:功能强大的定时任务调度框架,支持分布式,可动态实现任务调度加载。

cron时间规则

  • Cron表达式由6或7个空格分隔的时间字段组成:秒 分钟 小时 日期 月份 星期 年(可选)
字段  允许值  允许的特殊字符 
秒       0-59     , - * / 
分       0-59     , - * / 
小时      0-23     , - * / 
日期      1-31     , - * ? / L W C 
月份      1-12     , - * / 
星期      1-7       , - * ? / L C # 
年     1970-2099   , - * /

使用

简单任务
  • 通过@EnableScheduling开启定时任务调度。
package com.cn.web.common;

@Component //添加注入
@EnableScheduling  //开启定时任务 
public class ServiceScheduleTask {
	
	private static final Logger log = LoggerFactory.getLogger(ServiceScheduleTask.class);

	
	@Scheduled(cron = "0/10 * * * * ?")  //10秒执行一次
	public void getHostService() {
		log.info("执行定时任务")
	}
	
	
}
动态时间
  • mysql数据库创建时间规则表,创建crontTest数据库和cron表,3个字段id值、任务名和cron规则。
DROP DATABASE IF EXISTS `cronTest`;
CREATE DATABASE `cronTest`;
USE `cronTest`;
DROP TABLE IF EXISTS `cron`;
CREATE TABLE `cron`  (
  `cron_id` varchar(30) NOT NULL PRIMARY KEY,
  `cron_name` varchar(30) NOT NULL,
  `cron` varchar(30) NOT NULL  
);
INSERT INTO `cron` VALUES ('1', '0/5 * * * * ?');
  • java代码
package com.cn.web.common;

@Component
@EnableScheduling   // 开启定时任务
public class DynamicScheduleTask implements SchedulingConfigurer {

    private static final Logger log = LoggerFactory.getLogger(DynamicScheduleTask.class);
    //定义mybatis接口
    @Mapper
    public interface CronMapper {
        @Select("select cron from cron ")
        public Cron getCron();
    }

    @Autowired      //注入mapper
    @SuppressWarnings("all")
    CronMapper cronMapper;

    /**
     * 执行定时任务.
     */
    @Override
    public void configureTasks(ScheduledTaskRegistrar taskRegistrar) {

        taskRegistrar.addTriggerTask(
                //1.添加任务内容(Runnable)
                () -> log.info("执行动态定时任务: " + LocalDateTime.now().toLocalTime()),
                //2.设置执行周期(Trigger)
                triggerContext -> {
                    //2.1 从数据库获取执行周期
                    Cron cron = cronMapper.getCron();
                    //2.2 合法性校验.
                    if (StringUtils.isEmpty(cron.getCronName())) {
                        if(cron.getCronName().equals("task1")){
                            //任务一,时间周期为cron.getCront()

                        }else if(cron.getCronName().equals("task2")){
                            //任务二,时间周期为cron.getCront()
                        }
                    }
                    //2.3 返回执行周期(Date)
                    return new CronTrigger(cron).nextExecutionTime(triggerContext);
                }
        );
    }

}
  • 如果想实现复杂任务调度,可在通过反射实现多任务功能配置和调度。
开启多线程
  • 多线程需要创建针对定时任务的配置类
@Configuration 
public class ScheduledConfig {
	
	@Bean
	public TaskScheduler taskScheduler() {
		ThreadPoolTaskScheduler scheduling = new ThreadPoolTaskScheduler();
		scheduling.setPoolSize(10);
		scheduling.initialize();
		return scheduling;
	}

}

总结

  • spring boot简单任务建议使用spring自带scheduled,复杂或大量任务建议使用quartz。

参考资料

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值