如何实现集成定时任务SchedulingConfigurer
发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,本篇内容介绍了"如何实现集成定时任务SchedulingConfigurer"的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔
千家信息网最后更新 2025年11月08日如何实现集成定时任务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安全错误
数据库的锁怎样保障安全
软件开发需要学习什么专业课程
网络安全不留边框
从事软件开发最高等级是多少
金山网络安全招聘
h2数据库全文检索
青浦区惠普服务器
民警网络安全教育法规
服务器和网络怎么回事
关系型数据库+脏读
短地址服务器
空管局网络安全
部落龙升级数据库
山东省科技厅农民互联网
软件开发生产工厂
辽宁机械软件开发销售厂家
从数据库读取数据绑定前台
UCML数据库版本
互联网农业科技农场
组态王判断数据库连接状态
杭州康祺网络技术有限公司电话
团日活动网络安全教育内容
什么叫v型软件开发
国际国内重大网络安全事件
巴南区网络软件开发服务特点
龙岩国浩网络技术有限公司
工业网络安全测试仪
数据库一般存储在线交易数据
中秋国庆网络安全手抄报
UCML数据库版本
组态王判断数据库连接状态