如何实现集成定时任务SchedulingConfigurer
发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,本篇内容介绍了"如何实现集成定时任务SchedulingConfigurer"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔
千家信息网最后更新 2026年11月01日如何实现集成定时任务SchedulingConfigurer
本篇内容介绍了"如何实现集成定时任务SchedulingConfigurer"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
背景:
项目需要启动一个定时执行的任务,该任务的执行可以随时停止执行,要求在数据库配置执行规律。
调研:使用scheduling定时任务与springboot集成;
实例:
第一步:创建一个数据表,保存执行的任务
/*DDL 信息*/------------CREATE TABLE `hk_sys_task` ( `id` bigint(21) NOT NULL AUTO_INCREMENT COMMENT '主键', `task_uuid` varchar(50) DEFAULT NULL COMMENT '任务UUID', `task_name` varchar(50) DEFAULT NULL COMMENT '任务名称', `task_cron` varchar(50) DEFAULT NULL COMMENT '任务定时表达式', `class_name` varchar(100) DEFAULT NULL COMMENT '任务类', `method_name` varchar(100) DEFAULT NULL COMMENT '任务方法', `task_type` int(1) DEFAULT NULL COMMENT '任务类型', `remark` varchar(250) DEFAULT NULL, `del_mark` int(1) DEFAULT '1', `flag` int(1) DEFAULT '1', `create_user` varchar(50) DEFAULT NULL, `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, `modify_user` varchar(50) DEFAULT NULL, `modify_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8

2、创建springboot的SpringUtil用户获取bean
/** * @Author: Liu Yue * @Descripition: * @Date; Create in 2021/5/14 11:19 **/@Component@Slf4jpublic class SpringUtil implements ApplicationContextAware { private static ApplicationContext applicationContext; @Override public void setApplicationContext(ApplicationContext applicationContext) throws BeansException { if(SpringUtil.applicationContext == null) { SpringUtil.applicationContext = applicationContext; } log.info("========ApplicationContext配置成功,在普通类可以通过调用SpringUtils.getAppContext()获取applicationContext对象,applicationContext={},",SpringUtil.applicationContext+"========"); } //获取applicationContext public static ApplicationContext getApplicationContext() { return applicationContext; } //通过name获取 Bean. public static Object getBean(String name){ return getApplicationContext().getBean(name); } //通过class获取Bean. public static T getBean(Class clazz){ return getApplicationContext().getBean(clazz); } //通过name,以及Clazz返回指定的Bean public static T getBean(String name,Class clazz){ return getApplicationContext().getBean(name, clazz); }} 3、配置执行任务的类SysTaskConfig
/** * @Author: Liu Yue * @Descripition: * @Date; Create in 2021/5/14 9:34 **/@Lazy(value = false)@Component@Slf4jpublic class SysTaskConfig implements SchedulingConfigurer { @Resource private HkSysTaskMapper hkSysTaskMapper; private static ThreadPoolTaskScheduler threadPoolTaskScheduler = new ThreadPoolTaskScheduler(); private static Map> scheduledFutureMap = new HashMap<>(); //从数据库里取得所有要执行的定时任务 private List getAllTasks() { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(HkSysTask::getDelMark,1) .eq(HkSysTask::getFlag,1); return hkSysTaskMapper.selectList(wrapper); } static { threadPoolTaskScheduler.initialize(); } @Override public void configureTasks(ScheduledTaskRegistrar scheduledTaskRegistrar) { List allTasks = getAllTasks(); log.info("定时任务启动,预计启动任务数量={},; time={}",allTasks.size(),LocalDateTime.now()); //校验数据(这个步骤主要是为了打印日志,可以省略) checkDataList(allTasks); //通过校验的数据执行定时任务 int count = 0; if(allTasks.size()>0) { for (int i = 0; i < allTasks.size(); i++) { try { scheduledTaskRegistrar.addTriggerTask(getRunnable(allTasks.get(i)), getTrigger(allTasks.get(i))); count++; } catch (Exception e) { log.error("定时任务启动错误:" + allTasks.get(i).getClassName() + ";" + allTasks.get(i).getMethodName() + ";" + e.getMessage()); } } } log.info("定时任务实际启动数量="+count+"; time="+LocalDateTime.now()); } private static Trigger getTrigger(HkSysTask task){ return new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) { //将Cron 0/1 * * * * ? 输入取得下一次执行的时间 CronTrigger trigger = new CronTrigger(task.getTaskCron()); Date nextExec = trigger.nextExecutionTime(triggerContext); return nextExec; } }; } private static Runnable getRunnable(HkSysTask task){ return new Runnable() { @Override public void run() { Class> clazz; try { clazz = Class.forName(task.getClassName()); String className = lowerFirstCapse(clazz.getSimpleName()); Object bean = SpringUtil.getBean(className); Method method = ReflectionUtils.findMethod(bean.getClass(), task.getMethodName()); ReflectionUtils.invokeMethod(method, bean); } catch (ClassNotFoundException e) { e.printStackTrace(); } } }; } private List checkDataList(List list) { String errMsg=""; for(int i=0;i scheduledFuture = threadPoolTaskScheduler.schedule(getRunnable(task),getTrigger(task)); scheduledFutureMap.put(task.getTaskUuid(),scheduledFuture); log.info("启动定时任务" + task.getId() ); } /** * 取消定时任务 * @param task */ public static void cancel(HkSysTask task){ ScheduledFuture> scheduledFuture = scheduledFutureMap.get(task.getId()); if(scheduledFuture != null && !scheduledFuture.isCancelled()){ scheduledFuture.cancel(Boolean.FALSE); } scheduledFutureMap.remove(task.getId()); log.info("取消定时任务" + task.getId() ); } /** * 编辑 * @param task * @param */ public static void reset(HkSysTask task){ log.info("修改定时任务开始" + task.getId() ); cancel(task); start(task); log.info("修改定时任务结束" + task.getId()); }} 4、定时执行的测试类
...... public void test(){ iHkUserService.userTaskRun(); }......5、console输出的日志

"如何实现集成定时任务SchedulingConfigurer"的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注网站,小编将为大家输出更多高质量的实用文章!
任务
数据
错误
方法
配置
内容
实际
数据库
数量
日志
更多
知识
输出
实用
普通
成功
学有所成
接下来
信息
可以通过
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
互联网高科技
广州为想互联网科技有限公司
新华互联网科技学院
平安科技 互联网
喔噻互联网科技
西安互联网科技
万易互联网科技有限公司
迪茉互联网科技
深圳齐家互联网科技
广西互联网科技公司
中国科技互联网公司收入
阿大互联网科技有限公司
崇明区互联网教育科技售后服务
互联网媒体平台算高科技产业
佛山市拉法互联网科技有限公司
互联网科技圈年度人物
2021世界互联网领先科技成果发布
互联网科技创业有什么好项目
互联网科技企业文化
互联网科技快速发展优美句子
互联网核心科技是什么
网络科技有限互联网
互联网的科技创新
米客互联网科技
互联网科技网站
互联网金融监管科技
华夏恒生科技与互联网科技
易租星互联网科技有限公司
北京军民互联网科技公司
互联网科技大会大佬