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就完成了

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值