前序:
    在第一个例子我看到了自定义的作业类在任务调度器上注册后,则通过任务调度器来实现启动;下面,我们将同一个作业类执行两个任务,并都将他们注册到任务调度器上!

    首先一个job类指向两个任务,则任务性质可能一样,但任务信息存在差异;我们需要创建两个不同属性信息的job类实例;这个创建的动作是由Scheduler来完成;前面我们已经说了,它获取job信息并创建实例的前提操作如下:

  1. JobDetail jobDetail = new JobDetail(jobName,Scheduler.DEFAULT_GROUP, jobClass);
  2. jobDetail.getJobDataMap().put("SCAN_DIR", dirPath);
  3. jobDetail.getJobDataMap().put("MATCH_NAME", matchName);
  4. rigger trigger=TriggerUtils.makeSecondlyTrigger(scanInterval);
  5. trigger.setName(jobName + "-Trigger");
  6. trigger.setStartTime(new Date());
  7. scheduler.scheduleJob(jobDetail, trigger);

在注册后,任务调度器Scheduler就可以创建job实例,并执行execute操作了;

  下面是我们在任务调度器上要求执行两个任务的代码:

  1. /**
  2. * 一个简短的作业调度器
  3. * @author liuwei
  4. *
  5. */
  6. public class SimpleScheduler2 {
  7. static Log logger = LogFactory.getLog(SimpleScheduler.class);
  8. private Scheduler scheduler;
  9. /**
  10. * 调度器的启动操作
  11. */
  12. public void startScheduler() {
  13. try {
  14. LogUtil.print("运行任务开始");
  15. // 启动任务调度器
  16. this.getScheduler().start();
  17. /*将扫描目录的作业job注册到作业调度器上*/
  18. this.registJobtoScheduler();
  19. LogUtil.print("运行任务完毕");
  20. } catch (SchedulerException ex) {
  21. logger.error(ex);
  22. }
  23. }
  24. /**
  25. * 调度器的暂停操作
  26. * @param scheduler
  27. */
  28. public void modifyScheduler(Scheduler scheduler) {
  29. try {
  30. if (!scheduler.isInStandbyMode()) {
  31. //暂停调度器,该任务调度器上所有的作业实例都将停止工作
  32. scheduler.standby();
  33. }
  34. scheduler.start();
  35. } catch (SchedulerException ex) {
  36. logger.error(ex);
  37. }
  38. }
  39. /**
  40. * 注册一个作业到作业调度器
  41. * @throws SchedulerException
  42. * 注册一个作业到任务调度器上需要两个参数
  43. * a.作业明细
  44. * b.作业触发器
  45. */
  46. public void registJobtoScheduler() throws SchedulerException{
  47. LogUtil.print("将作业注册到调度器上");
  48. //获取任务调度器实例
  49. Scheduler scheduler=this.getScheduler();
  50. //任务1的相关信息
  51. String dirPath = "E:\\重要";
  52. String matchName = ".rar";
  53. String jobName="ScanDirectoryJob1";
  54. //注册操作
  55. this.registOperation(scheduler, jobName,
  56. ScanDirectoryJob.class, 10, dirPath, matchName);
  57. //任务2的相关信息
  58. String dirPath1 = "E:\\重要";
  59. String matchName2 = ".xls";
  60. String jobName2="ScanDirectoryJob2";
  61. //注册操作
  62. this.registOperation(scheduler, jobName2,
  63. ScanDirectoryJob.class, 10, dirPath1, matchName2);
  64. }
  65. /**
  66. *根据任务调度器,作业名称,作业类,启动时间间隔,及作业信息
  67. *注册两个作业任务到任务调度器上
  68. */
  69. private void registOperation(Scheduler scheduler, String jobName,
  70. Class jobClass, int scanInterval,String dirPath,String matchName )
  71. {
  72. try {
  73. //创建任务的作业信息
  74. //1)作业明细,作业数据集合,触发器
  75. //2)根据作业明细,触发器来实现任务的注册
  76. JobDetail jobDetail = new JobDetail
  77. (jobName,Scheduler.DEFAULT_GROUP, jobClass);
  78. jobDetail.getJobDataMap().put("SCAN_DIR", dirPath);
  79. jobDetail.getJobDataMap().put("MATCH_NAME", matchName);
  80. Trigger trigger = TriggerUtils.makeSecondlyTrigger
  81. (scanInterval);
  82. trigger.setName(jobName + "-Trigger");
  83. trigger.setStartTime(new Date());
  84. scheduler.scheduleJob(jobDetail, trigger);
  85. } catch (SchedulerException e) {
  86. e.printStackTrace();
  87. }
  88. }
  89. /**
  90. * 根据调度器工厂获得一个调度器
  91. * @return
  92. */
  93. private Scheduler getScheduler(){
  94. Scheduler  scheduler=null;
  95. try {
  96. LogUtil.print("获取任务调度器实例");
  97. //根据调度器工厂获得一个任务调度器的实例
  98. scheduler = StdSchedulerFactory.getDefaultScheduler();
  99. }catch (SchedulerException ex) {
  100. logger.error(ex);
  101. }
  102. return scheduler;
  103. }
  104. private void setScheduler(Scheduler scheduler){
  105. his.scheduler=scheduler;
  106. }
  107. }

请大家关注一个点!!!

   在 Scheduler 启动之前还是之后安排 Job 代码也就是任务调度器启动在先,还是说等所有工作在任务调度器上全部完成注册以后再开始启动呢?

   实际上之前之后的效果是一样;我们可以认为:

   a.若你先前启动,则当前作业还未在其上注册的话,启动后,任务调度器将处于等待状态,在(Job)作业在其上面进行注册后,则任务调度器将根据相关信息创建作业实例,并执行excute方法;

   b.若在注册后执行start方法的话,则任务调度器将立即创建作业实例,并执行excute方法;

下面是两个任务同时执行的日志效果:

2009-02-02 22:35:05,468 [SimpleScheduler]-[DEBUG] 运行任务开始

2009-02-02 22:35:05,468 [SimpleScheduler]-[DEBUG] 将作业注册到调度器上

2009-02-02 22:35:05,468 [SimpleScheduler]-[DEBUG] 获取任务调度器实例

2009-02-02 22:35:05,781 [org.quartz.simpl.SimpleThreadPool]-[INFO] Job execution threads will use class loader of thread: main

2009-02-02 22:35:05,875
[org.quartz.core.SchedulerSignalerImpl]-[INFO] Initialized Scheduler
Signaller of type: class org.quartz.core.SchedulerSignalerImpl

2009-02-02 22:35:05,890 [org.quartz.core.QuartzScheduler]-[INFO] Quartz Scheduler v.1.6.4 created.

2009-02-02 22:35:05,906 [org.quartz.simpl.RAMJobStore]-[INFO] RAMJobStore initialized.

2009-02-02 22:35:05,921 [org.quartz.impl.StdSchedulerFactory]-[INFO]
Quartz scheduler 'DefaultQuartzScheduler' initialized from default
resource file in Quartz package: 'quartz.properties'

2009-02-02 22:35:05,921 [org.quartz.impl.StdSchedulerFactory]-[INFO] Quartz scheduler version: 1.6.4

2009-02-02 22:35:06,000 [SimpleScheduler]-[DEBUG] 获取任务调度器实例

2009-02-02 22:35:06,000 [org.quartz.core.QuartzScheduler]-[INFO] Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.

2009-02-02 22:35:06,000 [SimpleScheduler]-[DEBUG] 运行任务完毕

2009-02-02 22:35:06,015 [org.quartz.simpl.SimpleJobFactory]-[DEBUG]
Producing instance of Job 'DEFAULT.ScanDirectoryJob1',
class=ScanDirectoryJob

2009-02-02 22:35:06,015 [org.quartz.simpl.SimpleJobFactory]-[DEBUG]
Producing instance of Job 'DEFAULT.ScanDirectoryJob2',
class=ScanDirectoryJob

2009-02-02 22:35:06,015 [org.quartz.core.JobRunShell]-[DEBUG] Calling execute on job DEFAULT.ScanDirectoryJob1

2009-02-02 22:35:06,015 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob1准备开始!

2009-02-02 22:35:06,015 [org.quartz.core.JobRunShell]-[DEBUG] Calling execute on job DEFAULT.ScanDirectoryJob2

2009-02-02 22:35:06,015 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob2准备开始!

2009-02-02 22:35:06,109 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\CLPM绩效评价表(贷中组).xls - Size: 60416

2009-02-02 22:35:06,109 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\10月考核.rar - Size: 75058

2009-02-02 22:35:06,125 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\8月绩效.rar - Size: 86177

2009-02-02 22:35:06,125 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\贷中组5月考核.rar - Size: 77959

2009-02-02 22:35:06,125 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\贷中组6月考核.rar - Size: 32950

2009-02-02 22:35:06,125 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\贷中组7月考核.rar - Size: 32565

2009-02-02 22:35:06,125 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\刘伟出差借款表.xls - Size: 10752

2009-02-02 22:35:06,125 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\开发任务跟踪表.xls - Size: 687616

2009-02-02 22:35:06,125 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\机票(刘伟).xls - Size: 13312

2009-02-02 22:35:06,125 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob2操作完毕!

2009-02-02 22:35:06,125 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob1操作完毕!

2009-02-02 22:35:15,984 [org.quartz.simpl.SimpleJobFactory]-[DEBUG]
Producing instance of Job 'DEFAULT.ScanDirectoryJob1',
class=ScanDirectoryJob

2009-02-02 22:35:15,984 [org.quartz.core.JobRunShell]-[DEBUG] Calling execute on job DEFAULT.ScanDirectoryJob1

2009-02-02 22:35:15,984 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob1准备开始!

2009-02-02 22:35:16,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\10月考核.rar - Size: 75058

2009-02-02 22:35:16,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\8月绩效.rar - Size: 86177

2009-02-02 22:35:16,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\贷中组5月考核.rar - Size: 77959

2009-02-02 22:35:16,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\贷中组6月考核.rar - Size: 32950

2009-02-02 22:35:16,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\贷中组7月考核.rar - Size: 32565

2009-02-02 22:35:16,000 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob1操作完毕!

2009-02-02 22:35:16,000 [org.quartz.simpl.SimpleJobFactory]-[DEBUG]
Producing instance of Job 'DEFAULT.ScanDirectoryJob2',
class=ScanDirectoryJob

2009-02-02 22:35:16,000 [org.quartz.core.JobRunShell]-[DEBUG] Calling execute on job DEFAULT.ScanDirectoryJob2

2009-02-02 22:35:16,000 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob2准备开始!

2009-02-02 22:35:16,015 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\CLPM绩效评价表(贷中组).xls - Size: 60416

2009-02-02 22:35:16,015 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\刘伟出差借款表.xls - Size: 10752

2009-02-02 22:35:16,015 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\开发任务跟踪表.xls - Size: 687616

2009-02-02 22:35:16,015 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\机票(刘伟).xls - Size: 13312

2009-02-02 22:35:16,015 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob2操作完毕!

2009-02-02 22:35:25,984 [org.quartz.simpl.SimpleJobFactory]-[DEBUG]
Producing instance of Job 'DEFAULT.ScanDirectoryJob1',
class=ScanDirectoryJob

2009-02-02 22:35:25,984 [org.quartz.core.JobRunShell]-[DEBUG] Calling execute on job DEFAULT.ScanDirectoryJob1

2009-02-02 22:35:25,984 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob1准备开始!

2009-02-02 22:35:26,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\10月考核.rar - Size: 75058

2009-02-02 22:35:26,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\8月绩效.rar - Size: 86177

2009-02-02 22:35:26,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\贷中组5月考核.rar - Size: 77959

2009-02-02 22:35:26,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\贷中组6月考核.rar - Size: 32950

2009-02-02 22:35:26,000 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\贷中组7月考核.rar - Size: 32565

2009-02-02 22:35:26,000 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob1操作完毕!

2009-02-02 22:35:26,015 [org.quartz.simpl.SimpleJobFactory]-[DEBUG]
Producing instance of Job 'DEFAULT.ScanDirectoryJob2',
class=ScanDirectoryJob

2009-02-02 22:35:26,015 [org.quartz.core.JobRunShell]-[DEBUG] Calling execute on job DEFAULT.ScanDirectoryJob2

2009-02-02 22:35:26,015 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob2准备开始!

2009-02-02 22:35:26,015 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\CLPM绩效评价表(贷中组).xls - Size: 60416

2009-02-02 22:35:26,015 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\刘伟出差借款表.xls - Size: 10752

2009-02-02 22:35:26,015 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\开发任务跟踪表.xls - Size: 687616

2009-02-02 22:35:26,015 [ScanDirectoryJob]-[DEBUG] 扫描符合条件的文件:E:\重要\机票(刘伟).xls - Size: 13312

2009-02-02 22:35:26,015 [ScanDirectoryJob]-[DEBUG] 作业任务名:ScanDirectoryJob2操作完毕!

企业级任务调度框架Quartz(4) 多个job实例注册到任务调度器上的更多相关文章

  1. [源码分析] 定时任务调度框架 Quartz 之 故障切换

    [源码分析] 定时任务调度框架 Quartz 之 故障切换 目录 [源码分析] 定时任务调度框架 Quartz 之 故障切换 0x00 摘要 0x01 基础概念 1.1 分布式 1.1.1 功能方面 ...

  2. 企业级任务调度框架Quartz(9) Quartz之作业触发器Trigger

    前序:      我们已经大概对Quartz的基本有了一个大概的认识:现在我们将要逐渐对Quartz的各个重要组件进行学习:前面已经对job进行了详细讲解,现在我们来认识下它的一个重要兄弟,没有它,作 ...

  3. 企业级任务调度框架Quartz(3) 一个简单的Quartz 例子

    1. 一个简单的Quartz 工程     本示例应用比起众所周知的 System.out.println("Hello world from Quartz") 来还是要有趣些.当 ...

  4. 企业级任务调度框架Quartz(1) --企业应用中的任务调度介绍

    由于目前的工作内容为建行CLPM批处理业务的设计工作,所以很好的理解批处理所用的任务调度框架Quartz势在必行:为了能够更好的去服务于工作,也 为了提升自己,所以我学习了Quartz Job Sch ...

  5. Java任务调度框架Quartz入门

    Quartz[kwɔːts]:石英,其框架和名字一样简单朴素又不失魅力,在Java程序界,Quartz大名鼎鼎,很多Java应用几乎都集成或构建了一个定时任务调度系统,Quartz是一个定时任务调度框 ...

  6. 通过源码分析Java开源任务调度框架Quartz的主要流程

    通过源码分析Java开源任务调度框架Quartz的主要流程 从使用效果.调用链路跟踪.E-R图.循环调度逻辑几个方面分析Quartz. github项目地址: https://github.com/t ...

  7. SpringBoot整合任务调度框架Quartz及持久化配置

    目录 本篇要点 SpringBoot与Quartz单机版快速整合 引入依赖 创建Job 调度器Scheduler绑定 自动配置,这里演示SimpleScheduleBuilder 手动配置,这里演示C ...

  8. 企业级任务调度框架Quartz(8) 线程在Quartz里的意义(2)

    前序:      做为企业里的任务调度框架,出现同一时间点同时运行两个任务,或者两个任务因为开始的执行时间和执行时间的长短,很有可能出现任务并发执行的情况:因为Quartz的实现是采用java编程,那 ...

  9. 企业级任务调度框架Quartz(5) Quartz的声明式配置

    前序:     前面我们已经通过编程的方式实现了多个作业任务执行具体操作的演示:但具体到实际的时候,如果我们要在 Job 启动之后改变它的执行时间和频度,则必须去修改源代码重新编译,我们很难去以编程的 ...

随机推荐

  1. QT中tableview不能更新数据,why?

    model->select(); //model->removeColumn(0);++++++++++++++++++++ //model->setHeaderData(model ...

  2. 读取com口接收byte数据的处理

    procedure Tfrm_CheckCloth.cnrs232ReceiveData(Sender: TObject; Buffer: Pointer; BufferLength: Word); ...

  3. foj 2173 floyd+矩阵快速幂

     Problem 2173 Nostop Accept: 52    Submit: 210 Time Limit: 3000 mSec    Memory Limit : 32768 KB  Pro ...

  4. 笔记本联想(Lenovo)G40-70M加装内存和SSD固态硬盘

    笔记本联想(Lenovo)G40-70M加装内存和SSD固态硬盘 系列文章: 笔记本电脑提速之加装内存条.SSD固态硬盘.光驱位换SSD固态硬盘 笔记本ThinkPad E430c加装内存和SSD固态 ...

  5. 数据库技术_Orcale技术(0002)_5分钟会用存储过程_存储过程实例

    基础技术: 样例业务功能: 1.依据传入的类型A_TYPE联合查询PROCEDURE_TEST_A表.PROCEDURE_TEST_A_SUB表中的数据.并显示主要内容. 2.依据传入的类型A_TYP ...

  6. UVA 1201 - Taxi Cab Scheme(二分图匹配+最小路径覆盖)

    UVA 1201 - Taxi Cab Scheme 题目链接 题意:给定一些乘客.每一个乘客须要一个出租车,有一个起始时刻,起点,终点,行走路程为曼哈顿距离,每辆出租车必须在乘客一分钟之前到达.问最 ...

  7. C C++每个头文件的功能说

    C/C++每个头文件的功能说明 传统 C++ #include <assert.h> //设定插入点 #include <ctype.h> //字符处理 #include &l ...

  8. ioctl方法详解

    设备控制接口(ioctl 函数)回想一下我们在字符设备驱动中介绍的struct file_operations 结构,这里我们将介绍一个新的方法: int (*ioctl) (struct inode ...

  9. NOIP2011 day2 第一题 计算系数

    计算系数 NOIP2011 day2 第一题 描述 给定一个多项式(ax+by)^k,请求出多项式展开后x^n*y^m项的系数. 输入格式 共一行,包含5 个整数,分别为 a ,b ,k ,n ,m, ...

  10. A - Vile Grasshoppers

    Problem description The weather is fine today and hence it's high time to climb the nearby pine and ...