Quartz2.2.1教程 快速上手

一、初识quartz
 
  JobDetail job = newJob(HelloJob.class).withIdentity("job1", "group1").build();
 
  Trigger trigger = newTrigger().withIdentity("trigger1", "group1").startNow().build();
 
  Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();
  scheduler.scheduleJob(job, trigger);
  scheduler.start();
  scheduler.shutdown();
 
  认识quartz读懂这几行代码就可以了。
 
  1.JobDetail是quartz的真正意义上的job,必须指定JobDetail的name,group属性,这两个属性是JobDetail的唯一标识;
     其中HelloJob是一个implements Job的类,它是真正意义上我们的业务执行类,我们的任务逻辑实现写在execute(JOB接口唯一的方法)的方法里.
 
  2.Trigger是JobDetail的触发器,JobDetail什么时候触发,触发间隔,触发次数都由它来指定;
     一个JobDetail可以被多个Trigger触发.
   
  3.Scheduler将JobDetail和Trigger组合在一起进行工作,Scheduler只有调用start()的方法才会真正的启动调度;
     Scheduler可以先start()启动,再scheduleJob(JobDetail,Trigger);反之亦然,很好理解,因为调度框架启动后就可以自动去调度任务.
   
 二、JobDetail,Trigger的更方便的生成方式
 
  quartz给我们提供了很多便捷的操作,最简单的,静态引入:
  import static org.quartz.JobBuilder.*;
  import static org.quartz.SimpleScheduleBuilder.*;
  import static org.quartz.CronScheduleBuilder.*;
  import static org.quartz.CalendarIntervalScheduleBuilder.*;
  import static org.quartz.TriggerBuilder.*;
  import static org.quartz.DateBuilder.*;
 
  这样,newJob,newTrigger,cronSchedule等一系列方便的方法就可以直接使用了.因为quartz的CronTrigger几乎可以满足所有的开发需求,
  所以我的Trigger全部采用CronTrigger来实现,只需生成对应的cron表达式.
 
  三、细谈Job,JobDetail
 
  一个简单的Job如下,事实上复杂的也是这样,只是区别于execute方法体:
  public class HelloJob implements Job {
    public HelloJob() {}
    public void execute(JobExecutionContext context) throws JobExecutionException{
      System.err.println("Hello!  HelloJob is executing.");
    }
  }
 
  如果你想给JobDetail传入参数,可以获取dataMap,并向其中随意put,建议所有属性都为String类型:
  jobDetail.getJobDataMap().put(JOB_DATA_KEY, JSONObject.toJSONString(Object));
 
  如果你想给Trigger传入参数,同样可以获取dataMap,不过这是JobDetail的,要知道trigger本身不需要任何参数,都是为JobDetail服务:
  trigger.getJobDataMap().put(JOB_DATA_KEY, JSONObject.toJSONString(Object));
 
  这样在你的execute方法里你就可以获取刚刚添加的所有参数,建议获取所有的:
  context.getMergedJobDataMap().getString("paramName");
 
  四、监听Trigger,监听JobDetail
 
  很简单
  1.创建自己的Listener:
  public class McTriggerListener extends TriggerListenerSupport
  public class McJobListener extends JobListenerSupport
 
  2.scheduler获取ListenerManager添加自己的listener即可:
  scheduler.getListenerManager().addJobListener(mcJobListener, allJobs());
  scheduler.getListenerManager().addTriggerListener(triggerListener);
 
  因为我需要记录任务执行成功失败,记录成功失败条数,失败原因,执行完成后更新状态,所以这里先将监听器摆出来,监听器的顺序:
 
  TriggerListenerSupport.triggerFired-->JobListenerSupport.jobToBeExecuted-->Job.execute-->JobListenerSupport.jobWasExecuted
  -->TriggerListenerSupport.triggerComplete
 
  这样你就可以随意的统计,或者在任务执行前后做自己想做的事情,我觉得这是很重要的.
 
  五、将quartz引入web项目
 
  1.如果web项目不将quartz的Scheduler先实例化并启动,那么quartz的生命周期将无法与web容器同步,导致的结果就是项目停了任务还在继续跑,项目起了任务
    不执行,还需要人工执行start()方法,我这里没有用spring,在web.xml中初始化:
    <!-- Quartz -->
    <servlet>
        <servlet-name>QuartzInitializer</servlet-name>
        <servlet-class>org.quartz.ee.servlet.QuartzInitializerServlet</servlet-class>
        <init-param>
            <param-name>config-file</param-name>
            <param-value>/quartz.properties</param-value>
        </init-param>
        <init-param>
            <param-name>shutdown-on-unload</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
    </servlet>
    
  2.当然了你需要配置quartz的属性文件,扔到maven的resources下即可,很简单如下:
    org.quartz.scheduler.instanceName: MainScheduler     //实例名称
    org.quartz.scheduler.instanceId: instance_one        //实例Id,集群时请设置不同的Id

org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool     //使用quartz线程池
    org.quartz.threadPool.threadCount = 10
    org.quartz.threadPool.threadPriority = 5
    org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true

org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX     //使用数据库持久化
    org.quartz.jobStore.tablePrefix = QRTZ_   //表前缀,所需要的表在quartz下载的包中可以找到
    org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate
    org.quartz.jobStore.dataSource = qzDS     //数据源
    org.quartz.jobStore.useProperties=true    //参数类型只能为String
    org.quartz.jobStore.isClustered=false     //是否集群

org.quartz.dataSource.qzDS.driver = com.mysql.jdbc.Driver
    org.quartz.dataSource.qzDS.URL = jdbc:mysql://localhost:3306/quartz?useUnicode=true&characterEncoding=utf-8
    org.quartz.dataSource.qzDS.user = root
    org.quartz.dataSource.qzDS.password = 123456
    org.quartz.dataSource.qzDS.maxConnections = 30
    
  3.web启动时自动初始化scheduler,并将其放在ServletContext中,并调用它的start()方法,程序可直接获取此实例,万事俱备:
 
    SchedulerFactory sf = (SchedulerFactory)servletContext.getAttribute(QuartzInitializerServlet.QUARTZ_FACTORY_KEY);
    sf..getScheduler();
    
  六、到这步quartz的框框就搭起来了,你可以自己写个管理类,负责添加,修改,暂停,重启,删除Job,比较简单.
 
  quartz官方文档写的已经很详细了,写这篇博客的目的是为了让初学的同学能尽快上手,上手之后再查阅官方文档的一些具体说明,就会事半功倍.
  本文如果有误解遗漏之处,还请路过各位多多批评指正,本人有quartz的QQ群欢迎大家来交流学习,群里有相关学习资料,
 
  QQ群号: 544639268

时间: 2024-11-05 02:37:28

Quartz2.2.1教程 快速上手的相关文章

下载快速上手数据挖掘之solr搜索引擎高级教程(Solr集群、KI分词、项目实战)

Solr是一个高性能,采用Java开发,基于Lucene的全文搜索服务器.同时对其进行了扩展,提供了比Lucene更为丰富的查询语言,同时实现了可配置.可扩展并对查询性能进行了优化,并且提供了一个完善的功能管理界面,是一款非常优秀的全文搜索引擎. 快速上手数据挖掘之solr搜索引擎高级教程(Solr集群.KI分词.项目实战),刚刚入手,转一注册文件,视频的确不错,可以先下载看看:http://pan.baidu.com/s/1jIdgtWM 密码:s1t3

新浪SAE快速上手教程

 新浪SAE快速上手教程[1]如何免费开通新浪云 2014-07-18 > 新浪SAE快速上手教程[2]如何创建.删除应用 2014-07-24 > 新浪SAE快速上手教程[3]如何上传应用代码包 2014-07-24 > 新浪SAE快速上手教程[4]如何在线编辑代码? 2014-07-28 > 新浪SAE快速上手教程[5]如何用svn部署代码 2014-07-28 http://jingyan.baidu.com/season/43090

《微信公众平台快速上手教程》目录导航,刘子骏de新媒体,图解版本

10年互联网从业者,草根创业者,新媒体营销研究者.作者博客:www.liuzijun.com 有些公众平台的基本用法可以参照上面的教程. 微信公众平台快速上手教程Part1 注册账户与认证 微信公众平台快速上手教程Part2 消息管理与群发 微信公众平台快速上手教程Part3 素材编辑 微信公众平台快速上手教程Part4 关键词自动回复 微信公众平台快速上手教程Part5 开发模式讲解 微信公众平台快速上手教程Part6 公众会议帐号 微信公众平台快速上手教程Part7 微信运营十大要决 微信公

Markdown简明教程5-CSDN Markdown快速上手

0.目录 目录 前言 CSDN Markdown特点 CSDN Markdown快速上手 1 使用快捷键 粗体斜体 引用 链接 高亮代码块 图片 标题 列表 分割线 撤销重复 2 使用离线写作 3 使用导入导出 4 个性定制文章模板 声明 1. 前言 Markdown是一种轻量级的标记语言,把作者从繁杂的排版工作中解放出来,实现易读易写的文章写作,已经逐渐成为事实上的行业标准.CSDN博客支持Markdown可以让广大博友更加专注于博客内容,大赞.但是,不少博友可能对Markdown比较生疏,本

EntityFramework 5.0 CodeFirst 教程01-搭建环境和快速上手

----------------------------目录------------------------------ EntityFramework 5.0 CodeFirst 教程01-搭建环境和快速上手 ----------------------------目录------------------------------ 网上关于EntityFramework 5.0的教程很多,但是大多数都是代码整理不清晰,有些甚至是拷贝,代码丢失等问题,本人最近也有一个项目是用到EntityFram

Airtest 快速上手教程

一.Airtest 简介: AirtestIDE 是一个跨平台的UI自动化测试编辑器,适用于游戏和App. 自动化脚本录制.一键回放.报告查看,轻而易举实现自动化测试流程 支持基于图像识别的 Airtest 框架,适用于所有Android和Windows游戏 支持基于UI控件搜索的 Poco 框架,适用于Unity3d,Cocos2d与Android App 能够运行在Windows和MacOS上 网易内部已成功应用在数十个项目上,利用 手机集群 进行大规模自动化测试 二.Airtest 知识链

Power BI教程_Power BI数据分析快速上手及案例实战

Power BI数据分析快速上手及案例实战 课程学习地址:http://www.xuetuwuyou.com/course/194 课程出自学途无忧网:http://www.xuetuwuyou.com 课程简介 本课程在<Power BI 数据分析快速上手>基础上结合大量的实例,深入讲解PowerBI中看似难懂的各种概念.操作, 并结合行业中的典型案例贯穿了从初级的数据透视表工具.数据透视表选项.数据透视表的刷新.数据透视表中的排序,到中级的动 态数据透视表的创建.数据透视表函数 GETPI

R语言快速上手入门

R语言快速上手入门 课程学习网址:http://www.xuetuwuyou.com/course/196 课程出自学途无忧网:http://www.xuetuwuyou.com 课程简介 本教程深入浅出地讲解如何使用R语言玩转数据.课程中涵盖R语言编程的方方面面,内容涉及R对象的类型.R的记号体系和环境系统.自定义函数.if else语句.for循环.S3类R的包系统以及调试工具等.本课程还通过示例演示如何进行向量化编程,从而对代码进行提速并尽可能地发挥R的潜能.本课程适合立志成为数据科学家的

intellij idea 13&amp;14 插件推荐及快速上手建议 (已更新!)

原文:intellij idea 13&14 插件推荐及快速上手建议 (已更新!) 早些年 在外企的时候,公司用的是intellij idea ,当时也是从eclipse.MyEclipse转过去的很是不习惯. 用了一周明显感觉爱上它了.因为它很智能,而且能纠正你很多不好的习惯. 后来跳巢到一家上市公司.因为大家都在用MyEclipse,要求开发工具统一.没办法只能转回MyEclipse.不过个人倒是一直关注intellij idea版本的发布和新的功能. 最近开始使用intellij idea