定时重启_SpringBoot基于数据库的定时任务实现方法
在我们平时开发的项目中,定时任务基本属于必不可少的功能,那大家都是怎么做的呢?但我知道的大多都是静态定时任务实现。
基于注解来创建定时任务非常简单,只需几行代码便可完成。实现如下:
@Configuration@EnableSchedulingpublic class SimpleScheduleTask { //10秒钟执行一次 @Scheduled(cron = "0/10 * * * * ?") private void tasks() { System.out.println("【定时任务】 每10秒执行一次!"); }}
Cron表达式参数分别表示(从左到右):
秒(0~59) 如0/5表示每5秒
分(0~59)
时(0~23)
日(0~31) 月的某一天
月(0~11)
周几( 可填1-7 或 SUN/MON/TUE/WED/THU/FRI/SAT)
就上面几行代码,就能搞定一个定时任务。显然,使用Scheduled 确实特别的方便,但有很大的缺点和局限,就是当我们调整了执行计划的时间时,需要重启服务才能生效,这就有些不方便。为了达到实时生效的效果,可以通过数据库来动态实现定时任务。
基于数据库的动态定时任务实现
将定时任务配置在数据库,启动项目的时候,用mybatis读取数据库,实例化对象,并设定定时任务。如果需要新增,减少,修改定时任务,仅需要修改数据库资料,并重启项目即可,无需改代码。
@Lazy(value = false)@Componentpublic class ScheduleTask implements SchedulingConfigurer { protected static Logger logger = LoggerFactory.getLogger(ScheduleTask.class); private SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Autowired private ScheduleTaskMapper scheduleTaskMapper; @Override public void configureTasks(ScheduledTaskRegistrar taskRegistrar) { List tasks = getAllScheduleTasks(); logger.info("【定时任务启动】 启动任务数:"+tasks.size()+"; time="+sdf.format(new Date())); //校验数据 checkDataList(tasks); //通过校验的数据执行定时任务 int count = 0; if(tasks.size()>0) { for (int i = 0; i < tasks.size(); i++) { try { taskRegistrar.addTriggerTask(getRunnable(tasks.get(i)), getTrigger(tasks.get(i))); count++; } catch (Exception e) { logger.error("task start error:" + tasks.get(i).getClassName() + ";" + tasks.get(i).getMethodName() + ";" + e.getMessage()); } } } logger.info("started task number="+count+"; time="+sdf.format(new Date())); }; /** * 获取要执行的所有任务 * @return */ private List getAllScheduleTasks() { ScheduleTaskExample example=new ScheduleTaskExample(); example.createCriteria().andIsDeleteEqualTo((byte) 0); return scheduleTaskMapper.selectByExample(example); } /** * 获取Runnable * * @param task * @return */ private Runnable getRunnable(ScheduleTask task){ return new Runnable() { @Override public void run() { try { Object obj = SpringUtil.getBean(task.getClassName()); Method method = obj.getClass().getMethod(task.getMethodName(),null); method.invoke(obj); } catch (InvocationTargetException e) { logger.error("refect exception:"+task.getClassName()+";"+task.getMethodName()+";"+ e.getMessage()); } catch (Exception e) { logger.error(e.getMessage()); } } }; } /** * 获取Trigger * * @param task * @return */ private Trigger getTrigger(ScheduleTask task){ return new Trigger() { @Override public Date nextExecutionTime(TriggerContext triggerContext) { //将Cron 0/1 * * * * ? CronTrigger trigger = new CronTrigger(task.getCron()); Date nextExec = trigger.nextExecutionTime(triggerContext); return nextExec; } }; } /** * 校验数据 * * @param list * @return */ private List checkDataList(List list) { String msg=""; for(int i=0;i
数据库配置
运行的结果
这样我们可以通过直接修改数据库,执行周期就会改变,并且不需要我们重启应用,十分方便。
定时重启_SpringBoot基于数据库的定时任务实现方法相关推荐
- springboot mysql行锁_SpringBoot基于数据库实现简单的分布式锁
本文介绍SpringBoot基于数据库实现简单的分布式锁. 1.简介 分布式锁的方式有很多种,通常方案有: 基于mysql数据库 基于redis 基于ZooKeeper 网上的实现方式有很多,本文主要 ...
- mysql 自动重启 计划_解决MYSQL死机,定时重启MYSQL,wdcp计划任务设定方法,
首先,确认你的默认计划任务是否可以执行,并产生日志.如果默认计划任务也不执行的话,请执行以下命令 yum install -y crontabs vixie-cron 增加一个新的计划任务 以重启we ...
- mysql 重启_解决MYSQL死机,定时重启MYSQL,wdcp计划任务设定方法,
首先,确认你的默认计划任务是否可以执行,并产生日志.如果默认计划任务也不执行的话,请执行以下命令 yum install -y crontabs vixie-cron 增加一个新的计划任务 以重启we ...
- 计算机不定时重启,Win10不定时重启什么原因?win10不定时自动重启解决方法
原标题:Win10不定时重启什么原因?win10不定时自动重启解决方法 最近有用户遇到了一些电脑问题,例如win10机器出现不定时重启的现象.这是什么原因引起的呢?又该如何解决呢?针对这两个问题,下面 ...
- 基于linux的定时任务实现tomcat服务的定时重启
基于linux的定时任务实现tomcat服务的定时重启 分析 实现 自动启停脚本 定时任务 总结 这两天项目有个需求说希望可以定时重启tomcat,然后临时研究了一下,在这里记录一下吧 分析 首先,我 ...
- spring定时每天早上八点_SpringBoot 如何实现并发定时任务?
一.在JAVA开发领域,目前可以通过以下几种方式进行定时任务 1.单机部署模式 Timer: jdk中自带的一个定时调度类,可以简单的实现按某一频度进行任务执行. 提供的功能比较单一,无法实现复杂的调 ...
- Linux终端定时任务重启,Linux设置定时重启系统的方法:定时任务crontab 和 编写脚本...
目录 crontab定时任务方法 1.确保crond服务正常运行 2.crond服务相关命令 3.编辑crond定时任务 编写自动重启脚本 1.定时重启脚本 2.设置开机启动 3.重启系统之后,自动重 ...
- 使用windows定时任务实现Tomcat服务器定时重启
Tomcat定时重启操作手册 一.背景 远程服务器Tomcat8容器运行一个WEB项目,当服务器运行时间超过1月时,浏览器访问时,请求一直得不到响应,或响应时间超长,严重影响用户使用,为解决此问题,对 ...
- 基于quartz实现定时任务管理系统
基于quartz实现定时任务管理系统 背景 说起定时任务框架,首先想到的是Quartz.这是定时任务的老牌框架了,它的优缺点都很明显.借助PowerJob 的readme文档的内容简单带过一下这部分. ...
- 基于数据库数据增量同步_基于canal实现分布式数据同步
应用场景 分布式架构中,数据同步常常是个大问题.例如,mysql中的数据,可能在ElasticSearch有一份索引,在redis有一份缓存,在Nginx有一份缓存,这时候只要你修改了mysql中的数 ...
最新文章
- nginx配置ssl加密(单双向认证、部分https)
- Python如何在循环语句中加入两个变量_python学习笔记(第一章)
- 来自Curriki和SankoréWiki的免费教育资源
- 零基础学python-5.6 数字位操作与其它工具
- 传统数据库在分布式领域的探索
- ewebeditor for php任意文件上传漏洞
- beta分布_浅谈分布之分布(beta分布)贝叶斯分析之1 精选
- 多项式ln,exp学习小计
- grasshopper for rhino 6下载_福利篇 | Rhino常用插件功能汇总
- 如何下载spring sts
- 抖音电商广告后台分为哪些?它们其中又有什么区别?
- java反射之 Field对象
- 最详细Python打包exe教程,并修改图标,只需30秒
- eclipse编写web.xml中出现The word ‘...‘ is not correctly spelled
- pc端客户端爬虫_爬虫微博模拟登陆-从移动端到PC端
- Ubuntu 18.04 安装 onedrive
- SLAM的数学基础(3):几种常见的概率分布的实现及验证
- java阳历转为阴历错了一天_Java 阴历阳历转换
- 绕任一向量旋转矩阵计算思考与实现
- 如何一键解决图片无损放大
热门文章
- CAVLC基于上下文自适应的可变长编码
- linux Audit 介绍【架构篇】
- oracle ogg11.2下载,ogg config for sqlserver 2012 to oracle 11.2(ogg 12.1 to 12.2)
- 湖北省月降水量分布数据
- linux查看进程占用内存与ps命令
- fx5u模拟量如何读取_最全三菱FX5U系列PLC视频
- 并查集练习--hdu1232poj1611poj2524
- 数位 dp 最低位最高位之差绝对值大于2_面试必备——手撕代码(2)“买卖股票的最佳时机”...
- linux 导出insert sql server,【IT爱好者】SQL Server自动生成INSERT语句(在SQL2005下测试通过)...
- yii2 表单提交没有对应的路由参数解决办法