前言

将项目中的所有定时任务都统一管理吧,使用 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<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 定时任务管理的更多相关文章

  1. Spring Boot集成持久化Quartz定时任务管理和界面展示

    本文是对之前的一篇文章Spring+SpringMVC+mybatis+Quartz整合代码部分做的一个修改和补充, 其中最大的变化就是后台框架变成了Spring Boot. 本工程所用到的技术或工具 ...

  2. java 多线程——quartz 定时调度的例子

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  3. 基于Spring4的定时任务管理

    在项目中,有时会遇到定时任务的处理,下面介绍一下我的做法. 此做法基于Spring4,Spring框架搭建成功,另需引入quartz.jar,pom.xml文件中加入 <dependency&g ...

  4. Quartz定时调度框架

    Quartz定时调度框架CronTrigger时间配置格式说明 CronTrigger时间格式配置说明 CronTrigger配置格式: 格式: [秒] [分] [小时] [日] [月] [周] [年 ...

  5. spring利用javamail,quartz定时发送邮件 <转>

    原文地址:spring利用javamail,quartz定时发送邮件 <转>作者:物是人非 spring提供的定时发送邮件功能,下面是一个简单的例子以供大家参考,首先从spring配置文件 ...

  6. Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群

    Spring+quartz集群配置,Spring定时任务集群,quartz定时任务集群 >>>>>>>>>>>>>> ...

  7. 基于PHP的crontab定时任务管理

    BY JENNER · 2014年11月10日· 阅读次数:6 linux的crontab一直是server运维.业务开展的利器.但当定时任务增多时,管理和迁移都变得非常麻烦,并且easy出问题.以下 ...

  8. 定时任务管理中心(dubbo+spring)-我们到底能走多远系列47

    我们到底能走多远系列47 扯淡: 又是一年新年时,不知道上一年你付出了多少,收获了多少呢?也许你正想着老板会发多少奖金,也许你正想着明年去哪家公司投靠. 这个时间点好好整理一下,思考总结一下,的确是个 ...

  9. Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置

    Spring整合quartz2.2.3总结,quartz动态定时任务,Quartz定时任务集群配置 >>>>>>>>>>>>&g ...

随机推荐

  1. OpenCV的安装与系统环境变量

    OpenCV的安装与系统环境变量 安装OpenCV本来是很简单的一件事,但配置却很麻烦.而且在配置过程中尤为重要的步骤就是系统环境变量的配置.我使用的是CodeBlick13.12与OpenCV1.0 ...

  2. UVALive 6656 Watching the Kangaroo --二分

    题意:给你一些区间,再查询一些点,问这些点与所有区间形成的最小距离的最大值.最小距离定义为:如果点在区间内,那么最小距离为0,否则为min(pos-L[i],R[i]-pos). 解法:当然要排个序, ...

  3. eclipse菜单解释及中英对照《二》

    上篇文章主要介绍了eclipse中每个大的标题下的中英文及其用法. 感谢http://blog.csdn.net/li_jinjian2005/article/details/2831641这个博主. ...

  4. android图片缩小和放大Matrix

    /**Bitmap放大的方法*/ private static Bitmap big(Bitmap bitmap) { Matrix matrix = new Matrix(); matrix.pos ...

  5. laravel记录

    1.使用数据库事务的时候需要传递参数,使用了use关键字,否则的话传递不进去,代码如下: public function postVote(Request $request){ $data = $re ...

  6. UWP 解压 GZIP

    准备工作: 通过 NUGET 安装 Microsoft.Bcl.Compression ; 使用命名空间 using System.IO.Compression ; public static asy ...

  7. 转载:有关SQL server connection KeepAlive 的FAQ

    转:http://blogs.msdn.com/b/apgcdsd/archive/2011/05/03/sql-server-connection-keepalive-faq.aspx 1.什么是S ...

  8. immutability-javascript

    https://www.sitepoint.com/immutability-javascript/

  9. android 6.0(api 23) SDK,不再提供org.apache.http.*(只保留几个类)

    在使用android-async-http的时候我的apl 更新到了23,我的build version也是23的时候出现了,org.apache.http.Header这个类找不到的情况,原因是在a ...

  10. BigDecimal 使用方法详解

    BigDecimal 使用方法详解 博客分类: java基础 bigdecimalmultiplyadddivide  BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (sca ...