Quartz 定时任务管理
前言
将项目中的所有定时任务都统一管理吧,使用 quartz 定时任务
设计思路
- 使用 quartz 的相关jar 包,懒得去升级了,我使用的是 quart 1.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<SysScheduler> cdLists = ssdao.getSchedulerListByStart(ssdao.need_start);
Iterator<SysScheduler> 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 方法中 关闭
<servlet>
<servlet-name>SysSchedulerServlet</servlet-name>
<servlet-class>com.common.servlet.SysSchedulerServlet</servlet-class>
<load-on-startup>0</load-on-startup>
</servlet>
Quartz 定时任务管理的更多相关文章
- Spring Boot集成持久化Quartz定时任务管理和界面展示
本文是对之前的一篇文章Spring+SpringMVC+mybatis+Quartz整合代码部分做的一个修改和补充, 其中最大的变化就是后台框架变成了Spring Boot. 本工程所用到的技术或工具 ...
- java 多线程——quartz 定时调度的例子
java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...
- 基于Spring4的定时任务管理
在项目中,有时会遇到定时任务的处理,下面介绍一下我的做法. 此做法基于Spring4,Spring框架搭建成功,另需引入quartz.jar,pom.xml文件中加入 <dependency&g ...
- Quartz定时调度框架
Quartz定时调度框架CronTrigger时间配置格式说明 CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年 ...
- spring利用javamail,quartz定时发送邮件 <转>
原文地址:spring利用javamail,quartz定时发送邮件 <转>作者:物是人非 spring提供的定时发送邮件功能,下面是一个简单的例子以供大家参考,首先从spring配置文件 ...
- Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群
Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群 >>>>>>>>>>>>>> ...
- 基于PHP的crontab定时任务管理
BY JENNER · 2014年11月10日· 阅读次数:6 linux的crontab一直是server运维.业务开展的利器.但当定时任务增多时,管理和迁移都变得非常麻烦,并且easy出问题.以下 ...
- 定时任务管理中心(dubbo+spring)-我们到底能走多远系列47
我们到底能走多远系列47 扯淡: 又是一年新年时,不知道上一年你付出了多少,收获了多少呢?也许你正想着老板会发多少奖金,也许你正想着明年去哪家公司投靠. 这个时间点好好整理一下,思考总结一下,的确是个 ...
- Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置
Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置 >>>>>>>>>>>>&g ...
随机推荐
- 一致性哈希算法学习及JAVA代码实现分析
1,对于待存储的海量数据,如何将它们分配到各个机器中去?---数据分片与路由 当数据量很大时,通过改善单机硬件资源的纵向扩充方式来存储数据变得越来越不适用,而通过增加机器数目来获得水平横向扩展的方式则 ...
- HDU 1394 & ZOJ 1484 Minimum Inversion Number
(更新点查询区间) 这题重在想到,写代码很容易了..这题是利用线段树求逆序数,不按给定的顺序建树,而是有序地插入.比如每插入一个数,就统计之前插入的那些数里比他大的有多少个,这个数就是此时的逆序数,然 ...
- BUG描述规范
BUG描述规范 一. 目的与适用范围 1.1 目的 报告软件测试错误的目的是为了保证修复错误的人员可以明确报告的错误,从而有利于分析错误产生的原因,定位错误,然后修正之.因此,报告软件测试错误的基本要 ...
- C语言中,&和&&都是做什么的?
&按位&&逻辑与 逻辑运算符把各个运算的变量(或常量)连接起来组成一个逻辑表达式.逻辑运算符有4个,它们分别是: !(逻辑非). ||(逻辑或).&&(逻辑与) ...
- java9-2形式参数
1.形式参数: 基本类型(太简单) 引用类型 类名:(匿名对象的时候其实我们已经讲过了)需要的是该类的对象 抽象类:需要的是该抽象的类子类对象 接口:需要的是该接口的实现类对象 A. 类名:(匿名对象 ...
- Ubuntu 下安装 apt-get install npm 失败的解决方案
Ubuntu 下安装 apt-get install npm 失败的解决方案: sudo apt-get remove nodejs npm ## remove existing nodejs an ...
- C# Thread.Join()用法的理解 转
指在一线程里面调用另一线程join方法时,表示将本线程阻塞直至另一线程终止时再执行 比如 1using System; 2 3namespace TestThreadJoin 4{ 5 class P ...
- prepareStatement createStatement
preparedstatement具备很多优点,开发者可能通常都使用它,只有在完全是因为性能原因或者是在一行sql语句中没有变量的时候才使用通常的statement. preparedstatemen ...
- android Camera 中添加一种场景模式
转自:http://blog.csdn.net/fulinwsuafcie/article/details/8833652 首先,来了解一下什么是场景模式. 最简单的方法当然是google了,这里有一 ...
- C语言 文件操作6--文件打开方式详解
fopen文件打开模式 r代表read的简写,+代表可读可写,w代表write,b代表bit二进制位,t代表text r 打开只读文件,该文件必须存在r+ 打开可读可写的文件,该文件必须存在(这里的写 ...