在我们平时开发的项目中,定时任务基本属于必不可少的功能,那大家都是怎么做的呢?但我知道的大多都是静态定时任务实现。

基于注解来创建定时任务非常简单,只需几行代码便可完成。实现如下:

@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基于数据库的定时任务实现方法相关推荐

  1. springboot mysql行锁_SpringBoot基于数据库实现简单的分布式锁

    本文介绍SpringBoot基于数据库实现简单的分布式锁. 1.简介 分布式锁的方式有很多种,通常方案有: 基于mysql数据库 基于redis 基于ZooKeeper 网上的实现方式有很多,本文主要 ...

  2. mysql 自动重启 计划_解决MYSQL死机,定时重启MYSQL,wdcp计划任务设定方法,

    首先,确认你的默认计划任务是否可以执行,并产生日志.如果默认计划任务也不执行的话,请执行以下命令 yum install -y crontabs vixie-cron 增加一个新的计划任务 以重启we ...

  3. mysql 重启_解决MYSQL死机,定时重启MYSQL,wdcp计划任务设定方法,

    首先,确认你的默认计划任务是否可以执行,并产生日志.如果默认计划任务也不执行的话,请执行以下命令 yum install -y crontabs vixie-cron 增加一个新的计划任务 以重启we ...

  4. 计算机不定时重启,Win10不定时重启什么原因?win10不定时自动重启解决方法

    原标题:Win10不定时重启什么原因?win10不定时自动重启解决方法 最近有用户遇到了一些电脑问题,例如win10机器出现不定时重启的现象.这是什么原因引起的呢?又该如何解决呢?针对这两个问题,下面 ...

  5. 基于linux的定时任务实现tomcat服务的定时重启

    基于linux的定时任务实现tomcat服务的定时重启 分析 实现 自动启停脚本 定时任务 总结 这两天项目有个需求说希望可以定时重启tomcat,然后临时研究了一下,在这里记录一下吧 分析 首先,我 ...

  6. spring定时每天早上八点_SpringBoot 如何实现并发定时任务?

    一.在JAVA开发领域,目前可以通过以下几种方式进行定时任务 1.单机部署模式 Timer: jdk中自带的一个定时调度类,可以简单的实现按某一频度进行任务执行. 提供的功能比较单一,无法实现复杂的调 ...

  7. Linux终端定时任务重启,Linux设置定时重启系统的方法:定时任务crontab 和 编写脚本...

    目录 crontab定时任务方法 1.确保crond服务正常运行 2.crond服务相关命令 3.编辑crond定时任务 编写自动重启脚本 1.定时重启脚本 2.设置开机启动 3.重启系统之后,自动重 ...

  8. 使用windows定时任务实现Tomcat服务器定时重启

    Tomcat定时重启操作手册 一.背景 远程服务器Tomcat8容器运行一个WEB项目,当服务器运行时间超过1月时,浏览器访问时,请求一直得不到响应,或响应时间超长,严重影响用户使用,为解决此问题,对 ...

  9. 基于quartz实现定时任务管理系统

    基于quartz实现定时任务管理系统 背景 说起定时任务框架,首先想到的是Quartz.这是定时任务的老牌框架了,它的优缺点都很明显.借助PowerJob 的readme文档的内容简单带过一下这部分. ...

  10. 基于数据库数据增量同步_基于canal实现分布式数据同步

    应用场景 分布式架构中,数据同步常常是个大问题.例如,mysql中的数据,可能在ElasticSearch有一份索引,在redis有一份缓存,在Nginx有一份缓存,这时候只要你修改了mysql中的数 ...

最新文章

  1. nginx配置ssl加密(单双向认证、部分https)
  2. Python如何在循环语句中加入两个变量_python学习笔记(第一章)
  3. 来自Curriki和SankoréWiki的免费教育资源
  4. 零基础学python-5.6 数字位操作与其它工具
  5. 传统数据库在分布式领域的探索
  6. ewebeditor for php任意文件上传漏洞
  7. beta分布_浅谈分布之分布(beta分布)贝叶斯分析之1 精选
  8. 多项式ln,exp学习小计
  9. grasshopper for rhino 6下载_福利篇 | Rhino常用插件功能汇总
  10. 如何下载spring sts
  11. 抖音电商广告后台分为哪些?它们其中又有什么区别?
  12. java反射之 Field对象
  13. 最详细Python打包exe教程,并修改图标,只需30秒
  14. eclipse编写web.xml中出现The word ‘...‘ is not correctly spelled
  15. pc端客户端爬虫_爬虫微博模拟登陆-从移动端到PC端
  16. Ubuntu 18.04 安装 onedrive
  17. SLAM的数学基础(3):几种常见的概率分布的实现及验证
  18. java阳历转为阴历错了一天_Java 阴历阳历转换
  19. 绕任一向量旋转矩阵计算思考与实现
  20. 如何一键解决图片无损放大

热门文章

  1. CAVLC基于上下文自适应的可变长编码
  2. linux Audit 介绍【架构篇】
  3. oracle ogg11.2下载,ogg config for sqlserver 2012 to oracle 11.2(ogg 12.1 to 12.2)
  4. 湖北省月降水量分布数据
  5. linux查看进程占用内存与ps命令
  6. fx5u模拟量如何读取_最全三菱FX5U系列PLC视频
  7. 并查集练习--hdu1232poj1611poj2524
  8. 数位 dp 最低位最高位之差绝对值大于2_面试必备——手撕代码(2)“买卖股票的最佳时机”...
  9. linux 导出insert sql server,【IT爱好者】SQL Server自动生成INSERT语句(在SQL2005下测试通过)...
  10. yii2 表单提交没有对应的路由参数解决办法