前言

将项目中的所有定时任务都统一管理吧,使用 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. [ubuntu]deb软件源

    虽然ubuntu的中国服务器的速度已经非常不错,但是难免,会有网络不畅的情形,所以修改软件源地址是一个基础的知识点. 修改ubuntu的软件源的方式有多种,一直是通过ubuntu软件中心提供的UI,还 ...

  2. extern "C" 用法解析

    extern "c"用法解析 作者 作者Jason Ding ,链接http://www.jianshu.com/p/5d2eeeb93590 引言 C++保留了一部分过程式语言的 ...

  3. 在linux下安装某个硬件驱动到方法

    东西很简单,几句话就能说清除. 使用lsipc检查你需要安装到硬件,记住硬件到关键型号,去搜索引擎搜索linux下的驱动文件 对文件进行安装简单的解压后基本上是 ./configure &&a ...

  4. Unity-WIKI 之 AllocationStats(内存分配)

    组件功能 allocationstats是一个简单的辅助工具,用于显示您的应用程序分配多少内存.它采用GC.GetTotalMemory来跟踪内存使用 使用方法 添加 Allocmem.cs 到场景中 ...

  5. setAttribute改变属性,动态改变类

    <style type="text/css"> .box{color:red;} </style> <div>通过setAttribute添加d ...

  6. RelayCommand命令

    原文:http://www.cnblogs.com/xiepeixing/archive/2013/08/13/3255152.html 常用Wpf开发中我们在ViewModel中实现INotifyP ...

  7. Android View.onMeasure方法的理解

    View在屏幕上显示出来要先经过measure(计算)和layout(布局).1.什么时候调用onMeasure方法? 当控件的父元素正要放置该控件时调用.父元素会问子控件一个问题,“你想要用多大地方 ...

  8. Socket Programming in C#--Getting Started

    Getting Started You can argue that one can overcome these shortcomings by multithreading meaning tha ...

  9. Linux 进程与线程一(创建-关闭线程)

    进程是一个实体.每一个进程都有他自己的内存地址段(heap,stack等等) 进程是执行中的程序. 程序是一个没有生命的实体,只有处理器赋予程序生命时,它才能成为一个活动的实体. 进程是操作系统中最基 ...

  10. SQL Server优化50法

    查询速度慢的原因很多,常见如下几种:    1.没有索引或者没有用到索引(这是查询慢最常见的问题,是程序设计的缺陷)    2.I/O吞吐量小,形成了瓶颈效应.    3.没有创建计算列导致查询不优化 ...