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 ...
随机推荐
- SaltStack远程执行-返回MySQL
上一篇:SaltStack远程执行-模块 参考官方文档:https://docs.saltstack.com/en/latest/ref/returners/all/salt.returners.my ...
- Exchange NLB 单播和多播模式比较
一般来说,在NLB的创建时,单网卡多播,双网卡单播. 双网卡单播时,因为主机之间不能互相通信,将设置内网通讯的网卡,也就是群集设置中的心跳. NLB模式 描述 优点 缺点 单播 网卡MAC会被NLB专 ...
- 新团建立时间 timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
w 不根据当前时间戳更新. `wtime` timestamp NULL DEFAULT CURRENT_TIMESTAMP,
- px、dp、sp、mm、in、pt这些单位有什么区别?
相信每个Android新手都会遇到这个问题,希望这篇帖子能让你不再纠结. px: 即像素,1px代表屏幕上一个物理的像素点: px单位不被建议使用,因为同样100px的图片,在不同手机上显示的实际大小 ...
- 服务器初识、linux安装、linux初识
电脑硬件 电源 既然是人体的心脏,保障电源供应,就需要质量好的电源,生产环境中单个核心服务器最好是双电源AB线路. 一个接220V电路,一个可能接蓄电池UPS(不间断电源) cpu 常见品牌:Inte ...
- Spring-基于设置函数的依赖注入
Spring 基于设置函数的依赖注入 当容器调用一个无参的构造函数或一个无参的静态factory方法来初始化你的bean后,通过容器在你的bean上调用设值函数,基于设值函数的DI就完成了. 下面是T ...
- Spark2.0机器学习系列之8:多类分类问题(方法归总和分类结果评估)
一对多(One-vs-Rest classifier) 将只能用于二分问题的分类(如Logistic回归.SVM)方法扩展到多类. 参考:http://www.cnblogs.com/CheeseZH ...
- Git的安装和设置
1.客户端下载 首先可以在https://git-scm.com/downloads下载客户端,进行安装. 2.安装 安装比较简单,可以直接默认一步一步往下安装即可: 3.配置github的ssh秘钥 ...
- python 随机分类
#encoding:utf-8import pandas as pdimport numpy as npfrom sklearn import datasets,linear_modelfrom sk ...
- android上传图片、视频、文件,服务端使用wcf接收
最近一直在搞android上传图片.视频.文件,服务端使用wcf接收,本文对调试中的遇到的问题进行记录. 首先android上传一些小图片是比较容易的一天下来差不多就能调试出来,但是上传一些大的文件时 ...