quartz调度器简单例子

来源:互联网 发布:海问律师事务所 知乎 编辑:程序博客网 时间:2024/05/11 18:36

以下例子是根据慕课网的视频学习仅作为个人记录之用。

1、创建maven   工程

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">  <modelVersion>4.0.0</modelVersion>  <groupId>com.jzy.demo</groupId>  <artifactId>HelloQuartz</artifactId>  <version>0.0.1-SNAPSHOT</version>  <packaging>jar</packaging>  <name>HelloQuartz</name>  <url>http://maven.apache.org</url>  <properties>    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>  </properties>  <dependencies>    <dependency>      <groupId>junit</groupId>      <artifactId>junit</artifactId>      <version>3.8.1</version>      <scope>test</scope>    </dependency>    <!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz --><dependency>    <groupId>org.quartz-scheduler</groupId>    <artifactId>quartz</artifactId>    <version>2.3.0</version></dependency>      </dependencies></project>


2、创建HelloJob类,实现Job接口和execute方法编写自己的业务逻辑

import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import org.quartz.Job;import org.quartz.JobDataMap;import org.quartz.JobExecutionContext;import org.quartz.JobExecutionException;import org.quartz.JobKey;import org.quartz.Trigger;import org.quartz.TriggerKey;public class HelloJob implements Job{public void execute(JobExecutionContext context) throws JobExecutionException {//
// 编写业务逻辑,打印当前时间
Calendar calendar = Calendar.getInstance();SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("HelloJob当前时间是:"+sf.format(calendar.getTime()));}}

3、创建Schedule类

import java.text.SimpleDateFormat;import java.util.Calendar;import java.util.Date;import org.quartz.JobBuilder;import org.quartz.JobDetail;import org.quartz.Scheduler;import org.quartz.SchedulerException;import org.quartz.SchedulerFactory;import org.quartz.SimpleScheduleBuilder;import org.quartz.Trigger;import org.quartz.TriggerBuilder;import org.quartz.impl.StdSchedulerFactory;public class HelloScheduler { public static void main(String[] args) throws SchedulerException {//创建一个JobDetail 实例,然后与HelloJob 实例绑定JobDetail  jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1").build();Date date = new Date();SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");System.out.println("HelloScheduler当前时间是:"+sf.format(date));//获取距离当前时间3秒后的时间date.setTime(date.getTime()+3000);//获取当前时间之后的6秒钟的时间Date endDate = new Date();endDate.setTime(endDate.getTime()+6000);//创建于一个触发器,定义该job立即执行,并且每个2秒执行一次Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1").startAt(date)//开始时间.endAt(endDate)//结束时间.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever())//执行计划.build();//创建scheduler 实例SchedulerFactory sfact = new StdSchedulerFactory();Scheduler scheduler = sfact.getScheduler();scheduler.start();scheduler.scheduleJob(jobDetail, trigger);}}


以上使用的是SimpleTrigger,以下使用的CronTrigger,可以实现更为复杂的定时计划。

差别在于构建相应的Trigger对象的方法上

CronTrigger trigger = (CronTrigger)TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1") .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ? *"))//*表示每(每秒、每分。。),?表示没有.build();
其中cronSchedule方法的参数是一个Cron表达式的字符串,分为  秒 分 时 日 月 周 年,年可以缺省,当然还可可以使用在线生成器工具去生成一个表达式即可。


结合spring MVC:以下的结合只是给出了配置,业务类需要自己实现补充

<!-- 如果只是想简单的调用一个方法,name就使用这种方法创建任务 --><bean id="simpleJobDetail"class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"><property name="targetObject" ref="myBean" /><!-- 传入一个bean对象,此对象已经使用@Component("myBean")注解的方式加入到spring容器 --><property name="targetMethod" value="printMessage" /><!-- 调用myBean里面的printMessage(自己的业务逻辑) --></bean><!-- 如果想要更加灵活的使用,可以传递参数进去的话,使用如下方式创建任务 --><bean id="firstComplexJobDetail"class="org.springframework.scheduling.quartz.JobDetailFactoryBean"><property name="jobClass"value="com.test.springquartz.quartz.FirstScheduledJob" /><!-- 需要运行的类 ,这个类需要继承QuartzJobBean并重写executeInternal方法--><property name="jobDataMap"><!-- 传入参数 --><map><entry key="anotherBean" value-ref="anotherBean" /><!-- key要与注解的bean一致--></map></property><property name="Durability" value="true"/><!-- 没有此属性会报错,job detail应该是即使没有trigger也要保留在quartz的存储中 --></bean><!-- trigger --><!-- 距离当前时间1秒之后执行,之后每隔两秒钟执行一次 --><bean id="mySimpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">    <property name="jobDetail"  ref="simpleJobDetail"/>    <property name="startDelay"  value="1000"/>    <property name="repeatInterval"  value="2000"/></bean> <!-- 每隔5秒钟执行一次 --><bean id="myCronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">    <property name="jobDetail"  ref="firstComplexJobDetail"/>    <property name="cronExpression"  value="0/5 * * ? * *"/></bean><!-- 调度器 --><bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean"><!-- 实践说明不用jobDetails属性也会按照trigger执行任务 -->    <property name="jobDetails">        <list>            <ref bean="simpleJobDetail"/>            <ref bean="firstComplexJobDetail"/>        </list>    </property>    <property name="triggers">        <list>            <ref bean="mySimpleTrigger"/>            <ref bean="myCronTrigger"/>        </list>    </property></bean>