博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Quartz 定时任务管理
阅读量:7109 次
发布时间:2019-06-28

本文共 8226 字,大约阅读时间需要 27 分钟。

前言

       将项目中的所有定时任务都统一管理吧,使用 quartz 定时任务

设计思路

  1.  使用 quartz 的相关jar 包,懒得去升级了,我使用的是 quart 1.6
  2.  写一个定时任务管理类
  3.  用一张数据库表去统一定时任务
  4.  项目启动的时候也启动定时任务管理,同时启动开启状态的定时任务
  5. 制定页面去管理数据库的定时任务,如果,任务有修改删除停止等,修改对应修改定时任务
  6. 项目停止时,停止定时任务

部分实现代码 

数据库脚本

DROP TABLE IF EXISTS `sys_scheduler`;CREATE TABLE `sys_scheduler` (  `id` int(11) NOT NULL AUTO_INCREMENT,  `cron` varchar(255) NOT NULL DEFAULT '',  `job_name` varchar(255) DEFAULT NULL,  `job_class` varchar(255) NOT NULL DEFAULT '',  `modify_time` datetime DEFAULT NULL,  `is_start` char(1) DEFAULT '0' COMMENT '任务状态是否启动,1-启动中,0-未启动',  PRIMARY KEY (`id`)) ENGINE=MyISAM DEFAULT CHARSET=utf8;/*Data for the table `sys_scheduler` */insert  into `sys_scheduler`(`id`,`cron`,`job_name`,`job_class`,`modify_time`,`is_start`) values (1,'0 30 * * * ?','示例定时任务','com.common.job.ExampleJob','2016-05-06 16:42:14','0');

定时任务管理(数据库的操作类省略)

package com.common.utils;import java.util.Iterator;import java.util.List;import org.apache.log4j.Logger;import org.quartz.CronTrigger;import org.quartz.JobDataMap;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.SchedulerFactory;import com.common.dao.SysSchedulerDao;import com.common.model.SysScheduler;/** * 定时任务 管理类 * @author ppnie * */public class SchedulerManager{    static SchedulerFactory schedFact = new org.quartz.impl.StdSchedulerFactory();    static Scheduler sched = null;    static SchedulerManager schedulerMgr = null;        private static final Logger logger = Logger.getLogger(SchedulerManager.class.getName());        /**     * 创建定时任务单例,并且初始化启动定时任务     * @return     */    public static SchedulerManager getInstance()    {        if (schedulerMgr == null)        {            schedulerMgr = new SchedulerManager();            schedulerMgr.init();        }        return schedulerMgr;    }        /**     * 初始化定时任务     */    public void init()    {        try        {            sched = schedFact.getScheduler();        }        catch (Exception e)        {            logger.error("init1:" + e.getMessage());        }        start();                /*从数据库启动定时任务 */        SysSchedulerDao ssdao = new SysSchedulerDao();        List
cdLists = ssdao.getSchedulerListByStart(ssdao.need_start); Iterator
ir = cdLists.iterator(); // System.out.println("-------------------Init Scheduler------------------"); while (ir.hasNext()) { SysScheduler scheduler = ir.next(); scheduleJob(scheduler); } } public void scheduleJob(SysScheduler scheduler) { scheduleJob(""+scheduler.getId(),scheduler.getJobClass(),scheduler.getCron()); if (isStarted()) { System.out.println("Schedule " + scheduler.getJobName()+" class="+scheduler.getJobClass() + " cron=" + scheduler.getCron()); } } /** * 添加某个任务到任务调度器 * @param jobId 任务id * @param jobClass 任务job 类名 * @param cron 定时时间 * 设置定时器调度的时程表格式 秒 分 时 天 月 周 0 0 12 * * ? 每天中午十二点触发 0 15 10 15 * ? 每月15号的10:15触发 0 15 10 ? * 2-6 * 每个周一、周二、周三、周四、周五的10:15触发 */ public void scheduleJob(String jobId, String jobClass, String cron) { if (isStarted()) { try { Class cls = Class.forName(jobClass); JobDetail jobDetail = new JobDetail(jobId, Scheduler.DEFAULT_GROUP, cls); CronTrigger trigger = new CronTrigger(jobId, Scheduler.DEFAULT_GROUP, cron); sched.scheduleJob(jobDetail, trigger); } catch (Exception e) { System.out.println("scheduleJob这里报错"+jobClass); logger.error("scheduleJob:" + e.getMessage()); } } } /** * * @param jobId * @param jobClass * @param cron * @param data_map */ public void scheduleJob(String jobId, String jobClass, String cron, String data_map) { if (isStarted()) { System.out.println("Schedule " + jobClass + " cron=" + cron); try { Class cls = Class.forName(jobClass); JobDetail jobDetail = new JobDetail(jobId, Scheduler.DEFAULT_GROUP, cls); CronTrigger trigger = new CronTrigger(jobId, Scheduler.DEFAULT_GROUP, cron); sched.scheduleJob(jobDetail, trigger); } catch (Exception e) { logger.error("scheduleJob:" + e.getMessage()); } } } /** * 根据jobId 在 任务调度器 中删除某个任务 * @param jobId */ public void delJob(String jobId) { try { sched.deleteJob(jobId, Scheduler.DEFAULT_GROUP); } catch (Exception e) { logger.error("deleteJob:" + e.getMessage()); } } /** * 重新发布任务,在这里是根据jobId 修改任务执行时间 corn * @param jobId * @param cron */ public void rescheduleJob(String jobId, String cron) { try { JobDetail jd = sched.getJobDetail(jobId, Scheduler.DEFAULT_GROUP); JobDataMap jdm = jd.getJobDataMap(); CronTrigger trigger = new CronTrigger("" + jobId, Scheduler.DEFAULT_GROUP, cron); trigger.setJobName("" + jobId); trigger.setJobGroup(Scheduler.DEFAULT_GROUP); trigger.setJobDataMap(jdm); sched.rescheduleJob(jobId, Scheduler.DEFAULT_GROUP, trigger); } catch (Exception e) { logger.error("rescheduleJob:" + e); } } /** * 启动 任务调度器 * 只有在Scheduler 有实例或standby 模式才能调用start() 方法 */ public void start() { try { sched.start(); } catch (Exception e) { logger.error("start:" + e); } } /** * 关闭 任务调度器Scheduler * 一旦调用shutdown() 方法之后就不能在调用start() 方法 */ public void shutdown() { System.out.println("------------------Shutdown Scheduler------------------"); try { sched.shutdown(); } catch (Exception e) { logger.error("shutdown:" + e.getMessage()); } schedulerMgr = null; } /** * 判断 任务调度器Scheduler 是否被启动 * @return */ public boolean isStarted() { boolean re = false; try { re = sched.isStarted(); } catch (Exception e) { logger.error("isStarted:" + e.getMessage()); } return re; } /** * 判断 任务调度器Scheduler 是否关闭 * @return * @throws SchedulerException */ public boolean isShutdown() { boolean re = false; try { sched.isShutdown(); } catch (SchedulerException e) { logger.error("isShutdown:" + e.getMessage()); } return re; } /** * 设置 Scheduler 为 standby 模式 * standby 模式时 Scheduler 暂时停止查找 Job 去执行 */ public void standby() { System.out.println("------------------Standby Scheduler------------------"); try { sched.standby(); } catch (Exception e) { logger.error("standby:" + e.getMessage()); } } /** * 判断Scheduler 操作是否是 standby 模式 */ public boolean isInStandbyMode() { boolean re = false; try { re = sched.isInStandbyMode(); } catch (Exception e) { logger.error("isInStandbyMode:" + e.getMessage()); } return re; } /** * 判断任务是否存在 * @param jobId * @return */ public boolean checkExists(String jobId) { boolean re = false; try { CronTrigger trigger = (CronTrigger)sched.getTrigger("" + jobId, Scheduler.DEFAULT_GROUP); return trigger != null; } catch (SchedulerException e) { logger.error("checkExists:" + e.getMessage()); } return re; } }

  

而随着项目的启停,可以建立一个servlet ,在init 方法中初始化 任务管理类,destory 方法中 关闭

SysSchedulerServlet
com.common.servlet.SysSchedulerServlet
0

  

 

转载地址:http://esvhl.baihongyu.com/

你可能感兴趣的文章
Oracle 学习之RMAN(九)BACKUP常用参数
查看>>
如何对待上司的弱项(或缺点)
查看>>
Linux压缩打包命令使用方法
查看>>
服务器主机IP禁ping 之 Windows平台
查看>>
【C#入门经典(第五版)】第二章 编写C#程序
查看>>
百度 mapv地理信息可视化开源库
查看>>
Cassandra – 数据结构设计概念和原则
查看>>
编译安装python3.7和ipython
查看>>
SSDCRM正式推出基于linux系统的一键安装版
查看>>
js prototype 。 网上摘抄
查看>>
Fastdfs安装心得
查看>>
sql入门
查看>>
统一设置Eclipse编码
查看>>
zabbix 修改默认的/zabbix 斜杠
查看>>
Centos vmware克隆系统后无法启动网卡
查看>>
Linux下日志(Log)服务器/客户端配置实验
查看>>
python高效计算2的次方(位左移)和整数与2的次方的乘积
查看>>
正则表达式语法
查看>>
Cisco交换机密码破解方法
查看>>
使用VS2010中 编码的UI 测试 进行UI自动化测试
查看>>