`
xidajiancun
  • 浏览: 457887 次
文章分类
社区版块
存档分类
最新评论

quartz使用小结

 
阅读更多

几年前接触了一下quartz,现在再用的时候忘了,所以网上搜了些资料,这个quartz任务调度开源框架还挺好用的。我把例子贴一下,以备自己下次用的时候查阅。

1、简单的quartz应用 SimpleTrigger

第一步,下载quartz包。我用的是quartz-all-1.6.4.jar这个版本

第二步,新建一个project,java project 或者 web project 都可以的。

第三步,写个简单的类继承Job,java代码块贴一下:

package com.zhangxy;

import java.util.Date;

import org.quartz.Job;

import org.quartz.JobExecutionContext;

import org.quartz.JobExecutionException;

public class SimpleJob implements Job {

public void execute(JobExecutionContext jobCtx)
throws JobExecutionException {

System.out.println(jobCtx.getTrigger().getName()
+ " triggered. time is:" + (new Date()));

}

}

第四步,写个触发器,里面就有一个main方法

package com.zhangxy;

import java.util.Date;

import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.impl.StdSchedulerFactory;

public class SimpleTriggerRunner {
public static void main(String args[]) {
try {
// ①创建一个JobDetail实例,指定SimpleJob
JobDetail jobDetail = new JobDetail("job1_1", "jGroup1",
SimpleJob.class);
// ②通过SimpleTrigger定义调度规则:马上启动,每2秒运行一次,共运行10次
SimpleTrigger simpleTrigger = new SimpleTrigger("trigger1_1",
"tgroup1");
simpleTrigger.setStartTime(new Date());
simpleTrigger.setRepeatInterval(2000);
simpleTrigger.setRepeatCount(10);
// ③通过SchedulerFactory获取一个调度器实例
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail, simpleTrigger);// ④ 注册并进行调度
scheduler.start();// ⑤调度启动
} catch (Exception e) {
e.printStackTrace();
}

}

}
第五步,运行该main方法。控制台每隔两秒钟就会输出trigger1_1 triggered. time is:Thu Apr 14 17:30:30 CST 2011,十次就结束了。

2、基于表达式 CronTrigger 支持重复的时间间隔(如每月某天定时执行)

第一、二、三步同第一相同

第四步:

package com.zhangxy;

import org.quartz.CronExpression;
import org.quartz.CronTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.impl.StdSchedulerFactory;

public class CronTriggerRunner {
public static void main(String args[]) {
try {

JobDetail jobDetail = new JobDetail("job1_2", "jGroup1",
SimpleJob.class);
// ①-1:创建CronTrigger,指定组及名称
CronTrigger cronTrigger = new CronTrigger("trigger1_2", "tgroup1");
CronExpression cexp = new CronExpression("0/5 * * * * ?");// ①-2:定义Cron表达式
cronTrigger.setCronExpression(cexp);// ①-3:设置Cron表达式
SchedulerFactory schedulerFactory = new StdSchedulerFactory();
Scheduler scheduler = schedulerFactory.getScheduler();
scheduler.scheduleJob(jobDetail, cronTrigger);
scheduler.start();
// ②
} catch (Exception e) {
e.printStackTrace();
}
}
}
第五步,运行main函数,控制台会每隔5秒输出trigger1_2 triggered. time is:Thu Apr 14 17:32:15 CST 2011

Cron表达式可以设置时刻,由六位或者7位组成 中间是用空隔隔开 每位都用指定字符表达。第一位是秒,第二位是分钟,第三位是小时,第四位日期,第五位月份,第六位星期,第七位年(可以写也可以不写)。如:0 0 12 * * ?代表每天12点执行,0 55 23 L * ?代表每个月最后一天23点55分执行。

位置
时间域名
允许值
允许的特殊字符

位置

时间域名

允许值

允许的特殊字符

1

0-59

, - * /

2

分钟

0-59

, - * /

3

小时

0-23

, - * /

4

日期

1-31

, - * ? / L W C

5

月份

1-12

, - * /

6

星期

1-7

, - * ? / L C #

7

年(可选)

空值1970-2099

, - * /


Cron表达式的时间字段除允许设置数值外,还可使用一些特殊的字符,提供列表、范围、通配符等功能,细说如下:

●星号(*):可用在所有字段中,表示对应时间域的每一个时刻,例如,*在分钟字段时,表示“每分钟”;

●问号(?):该字符只在日期和星期字段中使用,它通常指定为“无意义的值”,相当于点位符;

●减号(-):表达一个范围,如在小时字段中使用“10-12”,则表示从10到12点,即10,11,12;

●逗号(,):表达一个列表值,如在星期字段中使用“MON,WED,FRI”,则表示星期一,星期三和星期五;

●斜杠(/):x/y表达一个等步长序列,x为起始值,y为增量步长值。如在分钟字段中使用0/15,则表示为0,15,30和45秒,而5/15在分钟字段中表示5,20,35,50,你也可以使用*/y,它等同于0/y;

●L:该字符只在日期和星期字段中使用,代表“Last”的意思,但它在两个字段中意思不同。L在日期字段中,表示这个月份的最后一天,如一月的31号,非闰年二月的28号;如果L用在星期中,则表示星期六,等同于7。但是,如果L出现在星期字段里,而且在前面有一个数值X,则表示“这个月的最后X天”,例如,6L表示该月的最后星期五;

●W:该字符只能出现在日期字段里,是对前导日期的修饰,表示离该日期最近的工作日。例如15W表示离该月15号最近的工作日,如果该月15号是星期六,则匹配14号星期五;如果15日是星期日,则匹配16号星期一;如果15号是星期二,那结果就是15号星期二。但必须注意关联的匹配日期不能够跨月,如你指定1W,如果1号是星期六,结果匹配的是3号星期一,而非上个月最后的那天。W字符串只能指定单一日期,而不能指定日期范围;

●LW组合:在日期字段可以组合使用LW,它的意思是当月的最后一个工作日;

●井号(#):该字符只能在星期字段中使用,表示当月某个工作日。如6#3表示当月的第三个星期五(6表示星期五,#3表示当前的第三个),而4#5表示当月的第五个星期三,假设当月没有第五个星期三,忽略不触发;

● C:该字符只在日期和星期字段中使用,代表“Calendar”的意思。它的意思是计划所关联的日期,如果日期没有被关联,则相当于日历中所有日期。例如5C在日期字段中就相当于日历5日以后的第一天。1C在星期字段中相当于星期日后的第一天。

Cron表达式对特殊字符的大小写不敏感,对代表星期的缩写英文大小写也不敏感。

3.spring集成quartz应用

第一步,下载包quartz-all-1.6.4.jar 、 spring.jar 、commons-collections-3.1.jar、 commons-logging.jar、 log4j-1.2.15.jar

第二步,新建一个web project

第三步,写个简单的处理任务的类DemoJob,java代码块贴一下:

package com.zhangxy;

import java.util.Date;

public class DemoJob {
public void doProcess() throws Exception {
System.out.println("spring demojob triggered. time is:" + (new Date()));
}
}
第二步,在web.xml中配置一下spring相关代码:

<!-- Spring2.5的编码过滤器 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>
org.springframework.web.filter.CharacterEncodingFilter
</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

<!-- Spring ApplicationContext配置文件的路径,可使用通配符,多个路径用,号分隔 此参数用于后面的Spring-Context loader -->
<display-name>Struts Shop Project</display-name>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath*:spring/*.xml</param-value>
</context-param>
<!--Spring ApplicationContext 载入 -->
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>

第三步,新建applicationContext.xml,代码贴一下

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
<!-- 配置业务 -->
<bean id="demoJob" class="com.zhangxy.DemoJob" />
<!-- 配置作业 -->
<bean id="methodInvokingJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="demoJob" />
<property name="targetMethod" value="doProcess" />
</bean>
<!-- 配置触发器 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="methodInvokingJobDetail" />
<property name="cronExpression">
<value>0 0 12 * * ?</value><!-- 每天12点执行一次 -->
<!--<value>0 55 23 L * ?</value> --><!-- 每月最后一天 23点55分执行一次 -->
</property>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref local="cronTrigger" />
</list>
</property>
</bean>
</beans>

第四步,部署project并启动tomcat

控制台会在指定的时间输出spring demojob triggered. time is:Thu Apr 14 12:00:00 CST 2011

一个简单的spring+quartz的demo就完成了

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics