一、初识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什么时候触发,触发间隔,触发次数都由它来指定;同样Trigger的name,group属性,这两个属性是Trigger的唯一标识;
     一个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);
Scheduler scheduler = sf.getScheduler();

六、到这步quartz的框框就搭起来了,你可以自己写个管理类,负责添加,修改,暂停,重启,删除Job,比较简单.
 
  quartz官方文档写的已经很详细了,写这篇博客的目的是为了让初学的同学能尽快上手,上手之后再查阅官方文档的一些具体说明,就会事半功倍.

喜欢请关注微信公众号:码农小麦

Quartz2.2.1操作手册的更多相关文章

  1. (47) odoo详细操作手册

    odoo 8 详细操作手册, ERP(Odoo8.0)操作手册-v1.10(陈伟明).pdf 链接: http://pan.baidu.com/s/1hsp0bVQ 密码: r9tt 花了将近9个月时 ...

  2. SharePoint2010升级到SharePoint2013操作手册

    SharePoint2010升级到SharePoint2013操作手册 目 录 第一章 前言    3 第二章 升级前准备    3 第三章 升级流程图    5 第四章 升级过程    5 4.1 ...

  3. Mysql 操作手册

    mysql操作手册 版本:5.6.16mysql linux安装基本步骤:#rpm -e --nodeps mysql-lib-5.1.*#rpm -ivh mysql-server#rpm -ivh ...

  4. [转]SVN操作手册

    [转]SVN操作手册 2012-04-28 11:26 by NewSea, 2495 阅读, 0 评论, 收藏, 编辑 原文: http://hi.baidu.com/caiqiupeng/blog ...

  5. SVN操作手册(part1&part2)——SVN安装

    SVN操作手册 1.关于SVN 有一个简单但不十分精确比喻: SVN = 版本控制 + 备份服务器 简单的说,您可以把SVN当成您的备份服务器,更好的是,他可以帮您记住每次上传到这个服务器的档案内容. ...

  6. svn 迁移至git操作手册

    svn 迁移至git操作手册 项目交付.版本管理工具变更等情况下,迁移svn旧历史记录有很大必要,方便后续追踪文件的提交历史,文件修改记录比对等.git自带了从svn迁移至git的工具命令,可很好的对 ...

  7. jmeter接口入门操作手册

    基础操作手册:Windows Mr丶菜鸟 1.下载jmeter  ,jmeter是一款基于java的开源工具,可以测试接口和性能,需要jdk环境,下载jmeter地址:https://jmeter.a ...

  8. OpenDCIM-19.01操作手册

    OpenDCIM-19.01操作手册 1. 界面标签解析 1.1  用户管理 用户管理 部门管理 用户管理被存在数据表fac_User中,包含以下字段: UserID:是管理员还是用户 Name:报表 ...

  9. ALLOT流控设备操作手册指引

    ALLOT流控设备操作手册指引 1  简介 1.1 设备介绍 1.1.1 NetXploeer三层结构 Allot设备的管理如上图所示,采用三层结构. 1)NetEnforcer层,包括所有型号的Ne ...

随机推荐

  1. unix时间戳和localtime

    今天看代码的时候看到这么一段 void user::setHelpday() { int time = ::getTickCount(); m_helpday = (time +( * ))/( * ...

  2. UVa1449 - Dominating Patterns(AC自动机)

    题目大意 给定n个由小写字母组成的字符串和一个文本串T,你的任务是找出那些字符串在文本中出现的次数最多 题解 一个文本串,多个模式串,这刚好是AC自动机处理的问题 代码: #include <i ...

  3. Duff and Weight Lifting - 587A

    题目大意:某个人训练举重,他每次可以举起来2^wi的重量,不过这个人比较懒所以他想尽量减少训练的次数,如果所有的训练重量2^a1 +2^a2+....2^ak = 2^x,那么这些重量可以一次性训练( ...

  4. Spring源码入门——DefaultBeanNameGenerator解析

    我们知道在spring中每个bean都要有一个id或者name标示每个唯一的bean,在xml中定义一个bean可以指定其id和name值,但那些没有指定的,或者注解的spring的beanname怎 ...

  5. weblogic目录结构

    安装WEBLOGIC SERVER weblogic server 的目录结构 weblogic server的classpath变量 weblogic server使用命令行 通过管理控制台执行核心 ...

  6. 针对C#程序做性能测试的一些基本准则

    博客搬到了fresky.github.io - Dawei XU,请各位看官挪步.最新的一篇是:针对C#程序做性能测试的一些基本准则.

  7. sql转Linq的工具

    本文转载:http://www.cnblogs.com/huangxincheng/archive/2011/05/12/2044990.html 介绍一个小工具 Linqer   这些天写Linq挺 ...

  8. IOS ScrollowView 滑动到边缘后不允许再拖动

    当scrollowview滑动图片时,滑动到最后一张图本应该不让其滑动,但是如果不可以去设置属性,依然可以滑动,露出白色的底色,挺影响美观的, 可以设置其属性: sv.bounces=NO; 这样就不 ...

  9. Android---用Wi-Fi来建立对等连接

    本文译自:http://developer.android.com/training/connect-devices-wirelessly/wifi-direct.html WiFi对等API(P2P ...

  10. 分布式助手Zookeeper(二)

    分布式助手Zookeeper(二)博客分类: Zookeeper zookeeperzookeeper的安装和配置观察者observer 散仙在上篇文章介绍了,zookeeper的一系列基础知识,如果 ...