java quartz
什么是Quartz
Quartz是一个完全由Java编写的开源作业调度框架,为在Java应用程序中进行作业调度提供了简单却强大的机制。Quartz允许开发人员根据时间间隔来调度作业。它实现了作业和触发器的多对多的关系,还能把多个作业与不同的触发器关联。简单地创建一个org.quarz.Job接口的Java类,Job接口包含唯一的方法:
"Hello, Quartz"
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
public class HelloQuartzJob implements Job {
public void execute(JobExecutionContext context)
throws JobExecutionException {
System.out.println("Hello, Quartz! - executing its JOB at "+
new Date() + " by " + context.getTrigger().getName());
}
}
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;
public class HelloQuartzScheduling {
public static void main(String[] args)throws SchedulerException {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
JobDetail jobDetail = new JobDetail("helloQuartzJob",
Scheduler.DEFAULT_GROUP, HelloQuartzJob.class);
SimpleTrigger simpleTrigger = new SimpleTrigger("simpleTrigger",
Scheduler.DEFAULT_GROUP);
simpleTrigger.setStartTime(new Date(System.currentTimeMillis()));
simpleTrigger.setRepeatInterval(5000);
simpleTrigger.setRepeatCount(10);
scheduler.scheduleJob(jobDetail, simpleTrigger);
scheduler.start();
}
}
CronTrigger类
位置 |
含义 |
允许的特殊字符 |
1 |
秒(0~59) |
, - * / |
2 |
分(0~59) |
, - * / |
3 |
小时(0~24) |
, - * / |
4 |
日期(1~31) |
, - * / ? L W C |
5 |
月(JAN~DEC或1~12) |
, - * / |
6 |
星期(SUN~SAT或1~7) |
, - * / ? L C # |
7 |
年(可选,1970~2099),若为空,表示全部时间范围 |
, - * / |
特殊字符 |
说明 |
* |
通配符,任意值 |
? |
无特定值。通常和其他指定的值一起使用,表示必须显示该值但不能检查 |
- |
范围。e.g.小时部分10-12表示10:00,11:00, 12:00 |
, |
列分隔符。可以让你指定一系列的值。e.g.在星期域中指定MON、TUE和WED |
/ |
增量。表示一个值的增量,e.g.分钟域中0/1表示从0开始,每次增加1min |
L |
表示Last。它在日期和星期域中表示有所不同。在日期域中,表示这个月的最后一天,而在星期域中,它永远是7(星期六)。当你希望使用星期中某一天时,L字符非常有用。e.g.星期域中6L表示每一个月的最后一个星期五 |
W |
在本月内离当天最近的工作日触发,所谓的最近工作日,即当天到工作日的前后最短距离,如果当天即为工作日,则距离是0;所谓本月内指的是不能跨月取到最近工作日,即使前/后月份的最后一天/第一天确实满足最近工作日。e.g. LW表示本月的最后一个工作日触发,W强烈依赖月份。 |
# |
表示该月的第几个星期,e.g. 1#2表示每一个月的第一个星期一 |
C |
日历值。日期值是根据一个给定的日历计算出来的。在日期域中给定一个20C将在20日(日历包括20日)或20日后日历中包含的第一天(不包括20日)激活触发器。例如在一个星期域中使用6C表示日历中星期五(日历包括星期五)或者第一天(日历不包括星期五) |
"0 15 10 ? * 5#3" 每个月第三周的星期四的10点15分0秒触发任务
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
public class HelloQuartzScheduling {
public static void main(String[] args)
throws SchedulerException, ParseException {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
JobDetail jobDetail = new JobDetail("helloQuartzJob",
Scheduler.DEFAULT_GROUP, HelloQuartzJob.class);
String cronExpression = "30/5 * * * * ?"; // 每分钟的30s起,每5s触发任务
CronTrigger cronTrigger = new CronTrigger("cronTrigger",
Scheduler.DEFAULT_GROUP, cronExpression);
scheduler.scheduleJob(jobDetail, cronTrigger);
scheduler.start();
}
}
import java.util.Calendar;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.HolidayCalendar;
public class HelloQuartzScheduling {
public static void main(String[] args)
throws SchedulerException, ParseException {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
JobDetail jobDetail = new JobDetail("helloQuartzJob",
Scheduler.DEFAULT_GROUP, HelloQuartzJob.class);
Calendar cal = Calendar.getInstance();
cal.set(2012, Calendar.OCTOBER, 1); // 国庆节
HolidayCalendar holidayCal = new HolidayCalendar();
holidayCal.addExcludedDate(cal.getTime()); // 排除该日期
// addCalendar(String calName, Calendar calendar,
// boolean replace, boolean updateTriggers)
scheduler.addCalendar("calendar", holidayCal, true, false);
String cronExpression = "30/5 * * * * ?"; // 每5s触发任务
CronTrigger cronTrigger = new CronTrigger("cronTrigger",
Scheduler.DEFAULT_GROUP, cronExpression);
cronTrigger.setCalendarName("calendar");
scheduler.scheduleJob(jobDetail, cronTrigger);
scheduler.start();
}
}
JobStore: 任务持久化
Quartz支持任务持久化,这可以让你在运行时增加任务或者对现存的任务进行修改,并为后续任务的执行持久化这些变更和增加的部分。中心概念是JobStore接口。默认的是RAMJobStore。
配置文件
上述没有用到任何的配置文件。Quartz支持配置文件,它的好处是比编写代码简单,且修改后不需要重新编译源码。
>> 配置quartz.properties特性文件
quartz.properties文件定义了Quartz应用运行时行为,还包含了许多能控制Quartz运转的属性。它应放在工程的classpath中。
代码清单5:quartz.properties
# Configure Main Scheduler Properties
#============================================================================
# 实例名
org.quartz.scheduler.instanceName = QuartzScheduler
# 实例ID
org.quartz.scheduler.instanceId = AUTO
#============================================================================
# Configure ThreadPool
#============================================================================
org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool
# 线程个数
org.quartz.threadPool.threadCount = 3
org.quartz.threadPool.threadPriority = 5
#============================================================================
# Configure JobStore
#============================================================================
org.quartz.jobStore.misfireThreshold = 60000
org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore
#============================================================================
# Configure Plugins
#============================================================================
org.quartz.plugin.triggHistory.class = org.quartz.plugins.history.LoggingJobHistoryPlugin
# org.quartz.plugins.xml.JobInitializationPlugin是Quartz自带的插件,
# 默认时,这个插件会在 classpath 中搜索名为 quartz_jobs.xml
# 的文件并从中加载 Job 和 Trigger 信息
# v1.8之前用JobInitializationPlugin
#org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.JobInitializationPlugin
org.quartz.plugin.jobInitializer.class = org.quartz.plugins.xml.XMLSchedulingDataProcessorPlugin
org.quartz.plugin.jobInitializer.fileNames = quartz_jobs.xml
org.quartz.plugin.jobInitializer.failOnFileNotFound = true
org.quartz.plugin.jobInitializer.scanInterval =10
org.quartz.plugin.jobInitializer.wrapInUserTransaction = false
# 关闭quartz新版本检测功能
org.quartz.scheduler.skipUpdateCheck = true
>> 配置quartz_jobs.xml文件
在配置quart_jobs.xml时,遇到一个问题:
因为quartz从版本1.8开始,配置文件有所改动,以前quartz自带的插件是JobInitializationPlugin,而1.8中是XMLSchedulingDataProcessorPlugin. xml schema亦有所改变,难道是改变后配置不对?错误提示是插件类找不到,jar包也都加入到工程了啊。最后终于发现,在quartz.properties特性文件中配置插件行最后多打了个分号。原来是一个多余的分号引发的错误!
下面是新的xml配置文件格式示例。
代码清单6:quartz_jobs.xml格式
<?xmlversion="1.0"encoding="UTF-8"?>
<job-scheduling-dataxmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.ogr/xml/job_scheduling_data_1_8.xsd"
version="1.8">
<pre-processing-commands>
<!--在执行作业和触犯器之前执行的命令-->
<delete-jobs-in-group>*</delete-jobs-in-group>
<!--删除标示组中的所有作业,如果是“*”,则删除所有组中的作业,同时也会删除与作业有关的触犯器 -->
<delete-triggers-in-group>*</delete-triggers-in-group>
<!--删除标示组中的所有触犯器,如果是“*”,则删除所有组中的触发器 -->
<delete-job>
<!--删除指定的作业,同时也会删除与它关联的触犯器 -->
<name></name>
<group></group>
</delete-job>
<delete-trigger>
<!--删除指定的触犯器 -->
<name></name>
<group></group>
</delete-trigger>
</pre-processing-commands>
<processing-directives>
<!--在计划作业和触发器是应遵循的命令和原则 -->
<overwrite-existing-data>true or false</overwrite-existing-data>
<!--是否复写已经存在的任务计划数据,如果为false并且ingore-duplicates非false,那么文件中同名的触发器或作业将会继续存在,则会产生错误-->
<ignore-duplicates>true or false</ignore-duplicates>
<!--如果为true,计划中的任何同名的作业/触发器将会被忽略,不会产生错误-->
</processing-directives>
<schedule>
<job>
<name>JobName</name>
<group>JobGroup</group>
<description></description>
<job-class></job-class>
<job-listener-ref></job-listener-ref>
<!-- volatility,durability,recover必须按顺序设定 -->
<volatility></volatility>
<durability></durability>
<recover></recover>
<job-data-map>
<!-- entry可以设定多个-->
<entry>
<key></key>
<value></value>
</entry>
</job-data-map>
</job>
<trigger>
<!-- Trigger分为simple,cron,date-interval三种类型,一个trigger中只能指定一种类型-->
<simple>
<name></name>
<group></group>
<description></description>
<job-name></job-name>
<job-group></job-group>
<calendar-name></calendar-name>
<volatility></volatility>
<job-data-map>
<entry>
<key></key>
<value></value>
</entry>
</job-data-map>
<start-time></start-time>
<end-time></end-time>
<misfire-instruction></misfire-instruction>
<repeat-count></repeat-count>
<repeat-interval></repeat-interval>
</simple>
<cron>
<name></name>
<group></group>
<description></description>
<job-name></job-name>
<job-group></job-group>
<calendar-name></calendar-name>
<volatility></volatility>
<job-data-map>
<entry>
<key></key>
<value></value>
</entry>
</job-data-map>
<start-time></start-time>
<end-time></end-time>
<misfire-instruction></misfire-instruction>
<cron-expression></cron-expression>
<time-zone></time-zone>
</cron>
<date-interval>
<name></name>
<group></group>
<description></description>
<job-name></job-name>
<job-group></job-group>
<calendar-name></calendar-name>
<volatility></volatility>
<job-data-map>
<entry>
<key></key>
<value></value>
</entry>
</job-data-map>
<start-time></start-time>
<end-time></end-time>
<misfire-instruction></misfire-instruction>
<repeat-interval></repeat-interval>
<repeat-interval-unit></repeat-interval-unit>
</date-interval>
</trigger>
</schedule>
</job-scheduling-data>
代码清单7:quartz_jobs.xml示例
<?xmlversion="1.0"encoding="UTF-8"?>
<job-scheduling-dataxmlns="http://www.quartz-scheduler.org/xml/JobSchedulingData"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.quartz-scheduler.org/xml/JobSchedulingData http://www.quartz-scheduler.org/xml/job_scheduling_data_1_8.xsd"
version="1.8">
<pre-processing-commands>
<delete-jobs-in-group>*</delete-jobs-in-group> <!-- clear all jobs in scheduler -->
<delete-triggers-in-group>*</delete-triggers-in-group><!-- clear all triggers in scheduler -->
</pre-processing-commands>
<processing-directives>
<overwrite-existing-data>true</overwrite-existing-data>
<ignore-duplicates>false</ignore-duplicates>
</processing-directives>
<schedule>
<job>
<name>helloQuartzJob</name>
<group>DEFAULT</group>
<description>简单的quartz使用</description>
<job-class>HelloQuartzJob</job-class>
<volatility>false</volatility>
<durability>true</durability>
<recover>false</recover>
</job>
<trigger>
<cron>
<name>trigger</name>
<group>DEFAULT</group>
<job-name>helloQuartzJob</job-name>
<job-group>DEFAULT</job-group>
<cron-expression>30/5 * * * * ?</cron-expression>
</cron>
</trigger>
</schedule>
</job-scheduling-data>
代码清单8:Quartz任务调度
public static void main(String[] args)
throws SchedulerException, ParseException {
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.start();
}
}
这里遇到个问题,提示错误:
Exception in thread "main" Java.lang.NoClassDefFoundError: javax/transaction/UserTransaction
是由于缺少jta.jar,google出的结果是在quartz发行包的/lib中有此jar包,但是在1.8中没有找到。下载quartz 1.7中,也没有找到,因此,在网上搜一个jta.jar包放置过程classpath中,然后编译运行,ok.
java quartz的更多相关文章
- linux 下部署 java quartz job
国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...
- java Quartz定时器任务与Spring task定时的几种实现,
java Quartz定时器任务与Spring task定时的几种实现 基于java 的定时任务实现, Quartz 时间详细配置 请查阅 http://www.cnblogs.com/si ...
- Java&Quartz实现任务调度
目录 Java&Quartz实现任务调度 1.Quartz的作用 2.预备 3.Quartz核心 3.1.Job接口 3.2.JobDetail类 3.3 JobExecutionContex ...
- java Quartz定时器任务与Spring 的实现
1.xml配置 <?xml version="1.0" encoding="UTF-8"?><beans xmlns="http:/ ...
- java quartz 中的时间格式
SimpleTrigger 如果需要计划一个任务在指定的时间执行,或者在指定的时间后以指定的间隔连续执行多次,比如希望在2005年1月12号上午11:22:54开始执行一个任务,在这之后每隔20分钟执 ...
- Java Quartz用法
code: 这里的MyJob必须是public,这里Job实例化的时候要用到反射,必须是public的,不能与调度操作放同一个.java文件中. package com.qhong; import o ...
- java quartz的使用,做时间轮询调用 CronTrigger
import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionExceptio ...
- java Quartz任务调度器
1.quarz对java1.5实现的简单调度做了封装 /** * quartz对任务调度进了高度抽象: 1调度器:2任务:3触发器 * Job接口(任务):定义需要调度的任务 ...
- java+Quartz实现定时任务
1.首先:导入quartz相关的jar包,这里我用的是maven构建的项目,pom.xml文件导入如下: <dependency> <groupId>org.quartz-sc ...
随机推荐
- Python全栈day19(函数补充)
一,深浅拷贝 看拷贝列子day19-1.py s=[1,'zhangsan','lisi'] #s2是s的拷贝 s2=s.copy() #打印s2和s是一样的 print(s2) #修改s2 s2[0 ...
- mysql状态分析之show global status
这里整理下mysql global status的相关命令,在计算监控数据的时候需要用到 一.慢查询 show variables like '%slow%'; +------------------ ...
- 直接IO 零拷贝 DAM 自缓存应用程序
直接IO 零拷贝 DAM 自缓存应用程序
- Spring Data Jpa 初探
Spring Data 项目的目的是为了简化构建基于 Spring 框架应用的数据访问计数,包括非关系数据库.Map-Reduce 框架.云数据服务等等;另外也包含对关系数据库的访问支持. 下载网址: ...
- 简单JS旋转实现转盘抽奖效果
闲来没事,做了一个模拟转盘抽奖的HTML&JS的效果: 可以在设置的时候,选择几个区域,并且可以填写指针将要停止的区域 比如,我选择了"区域2",结果就是这样 具体可以见下 ...
- 剑指Offer——和为S的两个数字
题目描述: 输入一个递增排序的数组和一个数字S,在数组中查找两个数,是的他们的和正好是S,如果有多对数字的和等于S,输出两个数的乘积最小的. 输入描述: 对应每个测试案例,输出两个数,小的先输出. ...
- JavaWeb-Servlet开发2
---恢复内容开始--- ServletConfig 配置Servlet初始化参数 在Servlet的配置文件web.xml中,可以使用一个或多个<init-param>标签为servle ...
- 1. testNG+Maven 环境搭建
一:使用的工具 : TestNG 6.9.10 Maven 3.5 IDEA 二:创建maven项目,在pom.xml添加依赖 <?xml version="1.0" enc ...
- django模型:为已存在的表建立模型
为已经存在的表建立模型:参考https://blog.csdn.net/opera95/article/details/78200024 为已经存在的表建立模型1.python manage.py i ...
- JAVA与ACM
这两天学了一下JAVA的语法,还没有学习后面的核心地方,突然间觉得JAVA这门语言很棒,我要在接下来的时间系统的学习一下.就这么愉快地决定了. Java对于大数计算这方面的优势很大.最重要的是代码量小 ...