企业级任务调度框架Quartz(4) 多个job实例注册到任务调度器上
前序:
在第一个例子我看到了自定义的作业类在任务调度器上注册后,则通过任务调度器来实现启动;下面,我们将同一个作业类执行两个任务,并都将他们注册到任务调度器上!
首先一个job类指向两个任务,则任务性质可能一样,但任务信息存在差异;我们需要创建两个不同属性信息的job类实例;这个创建的动作是由Scheduler来完成;前面我们已经说了,它获取job信息并创建实例的前提操作如下:
- JobDetail jobDetail = new JobDetail(jobName,Scheduler.DEFAULT_GROUP, jobClass);
- jobDetail.getJobDataMap().put("SCAN_DIR", dirPath);
- jobDetail.getJobDataMap().put("MATCH_NAME", matchName);
- rigger trigger=TriggerUtils.makeSecondlyTrigger(scanInterval);
- trigger.setName(jobName + "-Trigger");
- trigger.setStartTime(new Date());
- scheduler.scheduleJob(jobDetail, trigger);
在注册后,任务调度器Scheduler就可以创建job实例,并执行execute操作了;
下面是我们在任务调度器上要求执行两个任务的代码:
- /**
- * 一个简短的作业调度器
- * @author liuwei
- *
- */
- public class SimpleScheduler2 {
- static Log logger = LogFactory.getLog(SimpleScheduler.class);
- private Scheduler scheduler;
- /**
- * 调度器的启动操作
- */
- public void startScheduler() {
- try {
- LogUtil.print("运行任务开始");
- // 启动任务调度器
- this.getScheduler().start();
- /*将扫描目录的作业job注册到作业调度器上*/
- this.registJobtoScheduler();
- LogUtil.print("运行任务完毕");
- } catch (SchedulerException ex) {
- logger.error(ex);
- }
- }
- /**
- * 调度器的暂停操作
- * @param scheduler
- */
- public void modifyScheduler(Scheduler scheduler) {
- try {
- if (!scheduler.isInStandbyMode()) {
- //暂停调度器,该任务调度器上所有的作业实例都将停止工作
- scheduler.standby();
- }
- scheduler.start();
- } catch (SchedulerException ex) {
- logger.error(ex);
- }
- }
- /**
- * 注册一个作业到作业调度器
- * @throws SchedulerException
- * 注册一个作业到任务调度器上需要两个参数
- * a.作业明细
- * b.作业触发器
- */
- public void registJobtoScheduler() throws SchedulerException{
- LogUtil.print("将作业注册到调度器上");
- //获取任务调度器实例
- Scheduler scheduler=this.getScheduler();
- //任务1的相关信息
- String dirPath = "E:\\重要";
- String matchName = ".rar";
- String jobName="ScanDirectoryJob1";
- //注册操作
- this.registOperation(scheduler, jobName,
- ScanDirectoryJob.class, 10, dirPath, matchName);
- //任务2的相关信息
- String dirPath1 = "E:\\重要";
- String matchName2 = ".xls";
- String jobName2="ScanDirectoryJob2";
- //注册操作
- this.registOperation(scheduler, jobName2,
- ScanDirectoryJob.class, 10, dirPath1, matchName2);
- }
- /**
- *根据任务调度器,作业名称,作业类,启动时间间隔,及作业信息
- *注册两个作业任务到任务调度器上
- */
- private void registOperation(Scheduler scheduler, String jobName,
- Class jobClass, int scanInterval,String dirPath,String matchName )
- {
- try {
- //创建任务的作业信息
- //1)作业明细,作业数据集合,触发器
- //2)根据作业明细,触发器来实现任务的注册
- JobDetail jobDetail = new JobDetail
- (jobName,Scheduler.DEFAULT_GROUP, jobClass);
- jobDetail.getJobDataMap().put("SCAN_DIR", dirPath);
- jobDetail.getJobDataMap().put("MATCH_NAME", matchName);
- Trigger trigger = TriggerUtils.makeSecondlyTrigger
- (scanInterval);
- trigger.setName(jobName + "-Trigger");
- trigger.setStartTime(new Date());
- scheduler.scheduleJob(jobDetail, trigger);
- } catch (SchedulerException e) {
- e.printStackTrace();
- }
- }
- /**
- * 根据调度器工厂获得一个调度器
- * @return
- */
- private Scheduler getScheduler(){
- Scheduler scheduler=null;
- try {
- LogUtil.print("获取任务调度器实例");
- //根据调度器工厂获得一个任务调度器的实例
- scheduler = StdSchedulerFactory.getDefaultScheduler();
- }catch (SchedulerException ex) {
- logger.error(ex);
- }
- return scheduler;
- }
- private void setScheduler(Scheduler scheduler){
- his.scheduler=scheduler;
- }
- }
请大家关注一个点!!!
在 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实例注册到任务调度器上的更多相关文章
- [源码分析] 定时任务调度框架 Quartz 之 故障切换
[源码分析] 定时任务调度框架 Quartz 之 故障切换 目录 [源码分析] 定时任务调度框架 Quartz 之 故障切换 0x00 摘要 0x01 基础概念 1.1 分布式 1.1.1 功能方面 ...
- 企业级任务调度框架Quartz(9) Quartz之作业触发器Trigger
前序: 我们已经大概对Quartz的基本有了一个大概的认识:现在我们将要逐渐对Quartz的各个重要组件进行学习:前面已经对job进行了详细讲解,现在我们来认识下它的一个重要兄弟,没有它,作 ...
- 企业级任务调度框架Quartz(3) 一个简单的Quartz 例子
1. 一个简单的Quartz 工程 本示例应用比起众所周知的 System.out.println("Hello world from Quartz") 来还是要有趣些.当 ...
- 企业级任务调度框架Quartz(1) --企业应用中的任务调度介绍
由于目前的工作内容为建行CLPM批处理业务的设计工作,所以很好的理解批处理所用的任务调度框架Quartz势在必行:为了能够更好的去服务于工作,也 为了提升自己,所以我学习了Quartz Job Sch ...
- Java任务调度框架Quartz入门
Quartz[kwɔːts]:石英,其框架和名字一样简单朴素又不失魅力,在Java程序界,Quartz大名鼎鼎,很多Java应用几乎都集成或构建了一个定时任务调度系统,Quartz是一个定时任务调度框 ...
- 通过源码分析Java开源任务调度框架Quartz的主要流程
通过源码分析Java开源任务调度框架Quartz的主要流程 从使用效果.调用链路跟踪.E-R图.循环调度逻辑几个方面分析Quartz. github项目地址: https://github.com/t ...
- SpringBoot整合任务调度框架Quartz及持久化配置
目录 本篇要点 SpringBoot与Quartz单机版快速整合 引入依赖 创建Job 调度器Scheduler绑定 自动配置,这里演示SimpleScheduleBuilder 手动配置,这里演示C ...
- 企业级任务调度框架Quartz(8) 线程在Quartz里的意义(2)
前序: 做为企业里的任务调度框架,出现同一时间点同时运行两个任务,或者两个任务因为开始的执行时间和执行时间的长短,很有可能出现任务并发执行的情况:因为Quartz的实现是采用java编程,那 ...
- 企业级任务调度框架Quartz(5) Quartz的声明式配置
前序: 前面我们已经通过编程的方式实现了多个作业任务执行具体操作的演示:但具体到实际的时候,如果我们要在 Job 启动之后改变它的执行时间和频度,则必须去修改源代码重新编译,我们很难去以编程的 ...
随机推荐
- redis liunx系统安装
同事总结非常好,借鉴一下 原文地址:https://www.cnblogs.com/dslx/p/9291535.html redis安装 下载redis的安装包上传到Linux服务器,安装包如下 h ...
- lunix下的redis数据库操作——zset有序集合
创建:(有序集合存在一个权重的概念) zadd zset 1 a 2 b 3 c 4 d 5 e 6 f 7 g # 输出: # 1) "a" # 2) "b" ...
- ORM进阶:Hibernate框架搭建及开发
本节将開始.使用hibernate搭建持久层.当然在决定用不用之前,还请斟酌一下是否使用.了解一下Hibernate的优缺点. Hibernate优劣对照 Hibernate是一个持久的ORM框架.首 ...
- 【cocos2d-x 3.7 飞机大战】 决战南海I (八) 背景移动
採用双层背景.这样效果更好 .h class BackgroundMove : public Layer { public: BackgroundMove(); ~BackgroundMove(); ...
- 【cl】java变量
知识点一: 变量:有声明,有初始化! 变量作用域:变量在声明的地方开始,到块结束(其中一对{}叫块) 变量不能重复声明(声明=定义):在同一个作用域中不能重复声明变量! 在作用域中如果已经有变量了,就 ...
- java中String的21种使用方法
(构造函数必须new出来) * public String (char[] vaue) 将一个字符数组变成字符串(构造函数) * public Stri ...
- Redis各种数据类型的使用场景
Redis的六种特性 l Strings l Hashs l Lists l Sets l Sorted Sets l Pub/Sub Redis各特性的应用场景 Strings Strings 数据 ...
- 分布式设计《初尝memcached》
之前听说过高性能的分布式缓存开源工具,但一直没有真正接触过,如今接触的产品中实用到过分布式缓存.所以决定一探到底.memcached是一个优秀的开源的分布式缓存工具.也是眼下比較火热的分布 ...
- 一个站点的诞生02--用Scrapy抓取数据
假设想抓数据,就须要有爬虫程序,业内叫crawler或者spider. 有各种语言版本号的开源爬虫.c++, Java, php,在github上搜一下,以"spider c++" ...
- SQL SERVER读书笔记:TempDB
每次SQL SERVER启动的时候,会重新创建. 用于 0.临时表 1.排序 2.连接(merge join,hash join) 3.行版本控制 临时表与表变量的区别: 1)表变量是存储在内存中的, ...