任务调度开源框架Quartz动态添加、修改和删除定时任务

  Quartz 是个开源的作业调度框架,为在 Java 应用程序中进行作业调度提供了简单却强大的机制。Quartz框架包含了调度器监听、作业和触发器监听。你可以配置作业和触发器监听为全局监听或者是特定于作业和触发器的监听。Quartz 允许开发人员根据时间间隔(或天)来调度作业。它实现了作业和触发器的多对多关系,还能把多个作业与不同的触发器关联。整合了 Quartz 的应用程序可以重用来自不同事件的作业,还可以为一个事件组合多个作业。并且还能和Spring配置整合使用。Quartz在功能上远远超越了JDK自带的Timer,很好很强大!好啦,直接上代码:

复制代码

/** * @Description:  * * @Title: QuartzManager.java * @Package com.joyce.quartz * @Copyright: Copyright (c) 2014 *  * @version V2.0 */    import org.quartz.CronTrigger;  
import org.quartz.JobDetail;  
import org.quartz.Scheduler;  
import org.quartz.SchedulerFactory;  
import org.quartz.impl.StdSchedulerFactory;  /** * @Description: 定时任务管理类 *  * @ClassName: QuartzManager * @Copyright: Copyright (c) 2014 *  * @author Comsys-LZP * @date 2014-6-26 下午03:15:52 * @version V2.0 */  
public class QuartzManager {  private static SchedulerFactory gSchedulerFactory = new StdSchedulerFactory();  private static String JOB_GROUP_NAME = "EXTJWEB_JOBGROUP_NAME";  private static String TRIGGER_GROUP_NAME = "EXTJWEB_TRIGGERGROUP_NAME";  /** * @Description: 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名 *  * @param jobName *            任务名 * @param cls *            任务 * @param time *            时间设置,参考quartz说明文档 *  * @Title: QuartzManager.java * @Copyright: Copyright (c) 2014 *  * @author Comsys-LZP * @date 2014-6-26 下午03:47:44 * @version V2.0 */  @SuppressWarnings("unchecked")  public static void addJob(String jobName, Class cls, String time) {  try {  Scheduler sched = gSchedulerFactory.getScheduler();  JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, cls);// 任务名,任务组,任务执行类  // 触发器  CronTrigger trigger = new CronTrigger(jobName, TRIGGER_GROUP_NAME);// 触发器名,触发器组  trigger.setCronExpression(time);// 触发器时间设定  sched.scheduleJob(jobDetail, trigger);  // 启动  if (!sched.isShutdown()) {  sched.start();  }  } catch (Exception e) {  throw new RuntimeException(e);  }  }  /** * @Description: 添加一个定时任务 *  * @param jobName *            任务名 * @param jobGroupName *            任务组名 * @param triggerName *            触发器名 * @param triggerGroupName *            触发器组名 * @param jobClass *            任务 * @param time *            时间设置,参考quartz说明文档 *  * @Title: QuartzManager.java * @Copyright: Copyright (c) 2014 *  * @author Comsys-LZP * @date 2014-6-26 下午03:48:15 * @version V2.0 */  @SuppressWarnings("unchecked")  public static void addJob(String jobName, String jobGroupName,  String triggerName, String triggerGroupName, Class jobClass,  String time) {  try {  Scheduler sched = gSchedulerFactory.getScheduler();  JobDetail jobDetail = new JobDetail(jobName, jobGroupName, jobClass);// 任务名,任务组,任务执行类  // 触发器  CronTrigger trigger = new CronTrigger(triggerName, triggerGroupName);// 触发器名,触发器组  trigger.setCronExpression(time);// 触发器时间设定  sched.scheduleJob(jobDetail, trigger);  } catch (Exception e) {  throw new RuntimeException(e);  }  }  /** * @Description: 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名) *  * @param jobName * @param time *  * @Title: QuartzManager.java * @Copyright: Copyright (c) 2014 *  * @author Comsys-LZP * @date 2014-6-26 下午03:49:21 * @version V2.0 */  @SuppressWarnings("unchecked")  public static void modifyJobTime(String jobName, String time) {  try {  Scheduler sched = gSchedulerFactory.getScheduler();  CronTrigger trigger = (CronTrigger) sched.getTrigger(jobName,TRIGGER_GROUP_NAME);  if (trigger == null) {  return;  }  String oldTime = trigger.getCronExpression();  if (!oldTime.equalsIgnoreCase(time)) {  JobDetail jobDetail = sched.getJobDetail(jobName,JOB_GROUP_NAME);  Class objJobClass = jobDetail.getJobClass();  removeJob(jobName);  addJob(jobName, objJobClass, time);  }  } catch (Exception e) {  throw new RuntimeException(e);  }  }  /** * @Description: 修改一个任务的触发时间 *  * @param triggerName * @param triggerGroupName * @param time *  * @Title: QuartzManager.java * @Copyright: Copyright (c) 2014 *  * @author Comsys-LZP * @date 2014-6-26 下午03:49:37 * @version V2.0 */  public static void modifyJobTime(String triggerName,  String triggerGroupName, String time) {  try {  Scheduler sched = gSchedulerFactory.getScheduler();  CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName,triggerGroupName);  if (trigger == null) {  return;  }  String oldTime = trigger.getCronExpression();  if (!oldTime.equalsIgnoreCase(time)) {  CronTrigger ct = (CronTrigger) trigger;  // 修改时间  ct.setCronExpression(time);  // 重启触发器  sched.resumeTrigger(triggerName, triggerGroupName);  }  } catch (Exception e) {  throw new RuntimeException(e);  }  }  /** * @Description: 移除一个任务(使用默认的任务组名,触发器名,触发器组名) *  * @param jobName *  * @Title: QuartzManager.java * @Copyright: Copyright (c) 2014 *  * @author Comsys-LZP * @date 2014-6-26 下午03:49:51 * @version V2.0 */  public static void removeJob(String jobName) {  try {  Scheduler sched = gSchedulerFactory.getScheduler();  sched.pauseTrigger(jobName, TRIGGER_GROUP_NAME);// 停止触发器  sched.unscheduleJob(jobName, TRIGGER_GROUP_NAME);// 移除触发器  sched.deleteJob(jobName, JOB_GROUP_NAME);// 删除任务  } catch (Exception e) {  throw new RuntimeException(e);  }  }  /** * @Description: 移除一个任务 *  * @param jobName * @param jobGroupName * @param triggerName * @param triggerGroupName *  * @Title: QuartzManager.java * @Copyright: Copyright (c) 2014 *  * @author Comsys-LZP * @date 2014-6-26 下午03:50:01 * @version V2.0 */  public static void removeJob(String jobName, String jobGroupName,  String triggerName, String triggerGroupName) {  try {  Scheduler sched = gSchedulerFactory.getScheduler();  sched.pauseTrigger(triggerName, triggerGroupName);// 停止触发器  sched.unscheduleJob(triggerName, triggerGroupName);// 移除触发器  sched.deleteJob(jobName, jobGroupName);// 删除任务  } catch (Exception e) {  throw new RuntimeException(e);  }  }  /** * @Description:启动所有定时任务 *  *  * @Title: QuartzManager.java * @Copyright: Copyright (c) 2014 *  * @author Comsys-LZP * @date 2014-6-26 下午03:50:18 * @version V2.0 */  public static void startJobs() {  try {  Scheduler sched = gSchedulerFactory.getScheduler();  sched.start();  } catch (Exception e) {  throw new RuntimeException(e);  }  }  /** * @Description:关闭所有定时任务 *  *  * @Title: QuartzManager.java * @Copyright: Copyright (c) 2014 *  * @author Comsys-LZP * @date 2014-6-26 下午03:50:26 * @version V2.0 */  public static void shutdownJobs() {  try {  Scheduler sched = gSchedulerFactory.getScheduler();  if (!sched.isShutdown()) {  sched.shutdown();  }  } catch (Exception e) {  throw new RuntimeException(e);  }  }  
}  

复制代码

以上就是quartz任务调度对于任务的常用操作,封装起来以便在外部调用!这样我们就需要任务的执行了:

复制代码

/** * @Description:  * * @Title: QuartzJob.java * @Package com.joyce.quartz * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-6-26 下午03:37:11 * @version V2.0 */  
package com.joyce.quartz;  import java.text.SimpleDateFormat;  
import java.util.Date;  import org.quartz.Job;  
import org.quartz.JobExecutionContext;  
import org.quartz.JobExecutionException;  /** * @Description: 任务执行类 * * @ClassName: QuartzJob * @Copyright: Copyright (c) 2014 * * @version V2.0 */  
public class QuartzJob implements Job {  @Override  public void execute(JobExecutionContext arg0) throws JobExecutionException {  System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+ ".........");    }  
}  

复制代码

Ok,我们来测试一下:

复制代码

/** * @Description:  * * @Title: QuartzTest.java * @Package com.joyce.quartz.main * @Copyright: Copyright (c) 2014 * * @author Comsys-LZP * @date 2014-6-26 下午03:35:05 * @version V2.0 */  
package com.joyce.quartz.main;  import com.joyce.quartz.QuartzJob;  
import com.joyce.quartz.QuartzManager;  /** * @Description: 测试类 * * @ClassName: QuartzTest * @Copyright: Copyright (c) 2014 *  * @version V2.0 */  
public class QuartzTest {  public static void main(String[] args) {  try {  String job_name = "动态任务调度";  System.out.println("【系统启动】开始(每1秒输出一次)...");    QuartzManager.addJob(job_name, QuartzJob.class, "0/1 * * * * ?");    Thread.sleep(5000);    System.out.println("【修改时间】开始(每2秒输出一次)...");    QuartzManager.modifyJobTime(job_name, "10/2 * * * * ?");    Thread.sleep(6000);    System.out.println("【移除定时】开始...");    QuartzManager.removeJob(job_name);    System.out.println("【移除定时】成功");    System.out.println("【再次添加定时任务】开始(每10秒输出一次)...");    QuartzManager.addJob(job_name, QuartzJob.class, "*/10 * * * * ?");    Thread.sleep(60000);    System.out.println("【移除定时】开始...");    QuartzManager.removeJob(job_name);    System.out.println("【移除定时】成功");  } catch (Exception e) {  e.printStackTrace();  }  }  
}  

复制代码

运行一下,看看效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/438772.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第十二节: 总结Quartz.Net几种部署模式(IIS、Exe、服务部署【借助TopSelf、服务类】)

一. IIS部署 比如在MVC框架中集成了Quartz.Net定时调度,此时该调度系统会随着MVC框架被挂在IIS下,IIS会进程回收,所以大部分开发都会遇到Quartz挂在IIS下一段时间不好用。 补充:IIS可以设置定时自动回收,默认回收是174…

[你必须知道的.NET] 第二回:对抽象编程:接口和抽象类

本文将介绍以下内容: • 面向对象思想:多态 • 接口 • 抽象类 1. 引言 在我之前的一篇post《抽象类和接口的谁是谁非》中,和同事管伟的讨论,得到很多朋友的关注,因为是不成体系的论道,所以给大家了解造…

Linux 启动失败 磁盘阵列,组建RAID5重启系统,出现md127的解决办法

我这里在组建RAID5之后重启了系统,当时/dev/md0变成了/dev/md127。出现这问题主要是我没有配置生成/etc/mdadm.conf文件,如果哪位伙伴出现类似我这种情况,而不是通过我这种方法解决的,希望能分享一下你的解决方法,谢谢…

[你必须知道的.NET] 第三回:历史纠葛:特性和属性

本文将介绍以下内容: • 定制特性的基本概念和用法 • 属性与特性的区别比较 • 反射的简单介绍 1. 引言 attribute是.NET框架引入的有一技术亮点,因此我们有必要花点时间来了解本文的内容,走进一个发现attribute登堂入室的入口。因为.N…

Linux的性能故障的含义,Linux排查性能故障的方法

好了,鉴于我们的Linux发行版现已安装,许多方面看起来似乎根本不“好”。今天我们将介绍为安装的Linux排查性能故障的方法。虽然今天的这篇文章明显倾向于Ubuntu,但我们探讨的几乎一切内容都同样适用于每个Linux发行版。要是哪些命令是专门针对…

[你必须知道的.NET] 第四回:后来居上:class和struct

本文将介绍以下内容: • 面向对象基本概念 • 类和结构体简介 • 引用类型和值类型区别 1. 引言 提起class和struct,我们首先的感觉是语法几乎相同,待遇却翻天复地。历史将接力棒由面向过程编程传到面向对象编程,class和stru…

linux shell跳板机,用shell开发跳板机

信号列表:在linux中和信号相关的常见命令为kill及trap命令,下来如何利用trap控制跳板机脚本来使用命令:命令:kill -l 和 trap -l企业实战中linux系统的重要信号及说明HUP(1) 挂起INT(2) 中断OUIT(3) 退…

[你必须知道的.NET] 第五回:深入浅出关键字---把new说透

本文将介绍以下内容: 面向对象基本概念new关键字深入浅出对象创建的内存管理 1. 引言 园子里好像没有或者很少把new关键字拿出来说的,那我就占个先机吧,呵呵。那么,我们到底有必要将一个关键字拿出来长篇大论吗?看来…

linux tcp server开源,GitHub - 06linux/cellnet: 高性能,简单,方便的开源服务器网络库...

cellnetcellnet是一个高性能,简单,方便的开源服务器网络库自由混合编码,业务代码无需调整。TCP和html5的应用都可以直接使用cellnet迅速搭建服务器框架。与Java的Netty或Mina网络库类似的Handler机制将给予强大定制功能。特性数据协议支持混合…

[你必须知道的.NET] 第六回:深入浅出关键字---base和this

本文将介绍以下内容: 面向对象基本概念base关键字深入浅出this关键字深入浅出1. 引言 new关键字引起了大家的不少关注,尤其感谢Anders Liu的补充,让我感觉博客园赋予的交流平台真的无所不在。所以,我们就有必要继续这个话题&…

[你必须知道的.NET] 第七回:品味类型---从通用类型系统开始

本文将介绍以下内容: .NET 基础架构概念 类型基础通用类型系统CLI、CTS、CLS的关系简述1. 引言 本文不是连环画,之所以在开篇以图形的形式来展示本文主题,其实就是想更加特别的强调这几个概念的重要性和关注度,同时希望从剖析其关…

[你必须知道的.NET] 第八回:品味类型---值类型与引用类型(上)-内存有理

本文将介绍以下内容: 类型的基本概念 值类型深入引用类型深入值类型与引用类型的比较及应用1. 引言 买了新本本,忙了好几天系统,终于开始了对值类型和引用类型做个全面的讲述了,本系列开篇之时就是因为想写这个主题,…

[你必须知道的.NET]第九回:品味类型---值类型与引用类型(中)-规则无边

接上回[第八回:品味类型---值类型与引用类型(上)-内存有理]的探讨,继续我们关注值类型和引用类型的话题。 本文将介绍以下内容: 类型的基本概念 值类型深入引用类型深入值类型与引用类型的比较及应用1. 引…

[你必须知道的.NET]第十回:品味类型---值类型与引用类型(下)-应用征途

本文将介绍以下内容: 类型的基本概念 值类型深入引用类型深入值类型与引用类型的比较及应用 [下载]:[类型示例代码] 1. 引言 值类型与引用类型的话题经过了两个回合([第八回:品味类型---值类型与引用类型(上&#xf…

[你必须知道的.NET]第十一回:参数之惑---传递的艺术(上)

本文将介绍以下内容: 按值传递与按引用传递深论ref和out比较 参数应用浅析 1. 引言 接上回《第九回:品味类型---值类型与引用类型(中)-规则无边》中,对值类型和引用类型的讨论,其中关于string…

[你必须知道的.NET]第十二回:参数之惑---传递的艺术(下)

本文将介绍以下内容: 按值传递与按引用传递深论ref和out比较 参数应用浅析 接上篇继续,『第十一回:参数之惑---传递的艺术(上)』 4.2 引用类型参数的按值传递 当传递的参数为引用类型时,传递和操作的是指…

[你必须知道的.NET]第十三回:从Hello, world开始认识IL

本文将介绍以下内容: IL代码分析方法 Hello, world历史 .NET学习方法论1. 引言 1988年Brian W. Kernighan和Dennis M. Ritchie合著了软件史上的经典巨著《The C programming Language》,我推荐所有的程序人都有机会重温这本历史上的经典之作。从那时起…

[你必须知道的.NET]第十四回:认识IL代码---从开始到现在

本文将介绍以下内容: IL代码分析方法 IL命令解析 .NET学习方法论 1. 引言 自从『你必须知道.NET』系列开篇以来,受到大家很多的关注和支持,给予了anytao巨大的鼓励和动力。俱往昔,我发现很多的园友都把…

[你必须知道的.NET]第十五回:继承本质论

本文将介绍以下内容: 什么是继承?继承的实现本质1. 引言 关于继承,你是否驾熟就轻,关于继承,你是否了如指掌。 本文不讨论继承的基本概念,我们回归本质,从编译器运行的角度来揭示.NET继承中的…

海岸鸿蒙2018年标准物质,海岸鸿蒙——20年权威的标准物质研制单位

摘要:海岸鸿蒙创办于1996年,是专业从事国家标准物质研发、生产、销售的高新技术企业。海岸鸿蒙创办于1996年,是专业从事国家标准物质研发、生产、销售的高新技术企业。海岸鸿蒙自创办以来,一直秉持“以市场为导向,以科…