quartz使用小结

    技术2022-05-20  63

    几年前接触了一下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)