1.什么是quartz?
quartz百度百科
quartz是一种较为成熟的开源任务调度框架,大致有四部分组成Job,JobDetail,Triagger(触发),Schedule(调度)
思路就是 触发事件—>调度(核心)—>执行任务
2.java样例
导入pom依赖
<!-- https://mvnrepository.com/artifact/org.quartz-scheduler/quartz -->
<dependency>
<groupId>org.quartz-scheduler</groupId>
<artifactId>quartz</artifactId>
<version>2.3.0</version>
</dependency>
package com.dongshuo.test.cronjob;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @author dongshuo
* @data 2018/7/27 14:24
* @Description quartz 由4大部分组成 job jobdetail schedule trigger(触发)
*/
public class QuartzJob implements Job{
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
System.out.println("QuartzJob start");
//业务逻辑
StringBuilder sb = new StringBuilder("任务开始执行啦" + Thread.currentThread().getName());
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
sb.append(sdf.format(date));
System.out.println(sb);
System.out.println("QuartzJob end");
}
}
package com.dongshuo.test.cronjob;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
/**
* @author dongshuo
* @data 2018/7/27 14:41
* @Description
*/
public class QuarzSchedule {
public static void main(String[] args) throws SchedulerException {
//构造JobDetail 绑定业务逻辑QuartzJob.class
JobDetail jobDetail = JobBuilder.newJob(QuartzJob.class).build();
//创建一个Trigger触发器的实例,定义该job立即执行,并且每2秒执行一次,一直执行
SimpleTrigger trigger = TriggerBuilder.newTrigger()
.withIdentity("myTrigger").startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule()
.withIntervalInSeconds(2).repeatForever()).build();
//每日的9点40触发任务
CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity("cronTrigger")
.withSchedule(CronScheduleBuilder.cronSchedule("0 40 9 * * ? ")).build();
//创建schedule实例
StdSchedulerFactory factory = new StdSchedulerFactory();
Scheduler scheduler = factory.getScheduler();
scheduler.start();
scheduler.scheduleJob(jobDetail,trigger);
}
}
以上内容实现了最简单的使用
3.结合Spring
<!-- 定义jobDetail -->
<bean id ="myJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<!-- 指定具体的job类 -->
<property name ="jobClass" value="com.zx.quartz.MyJob" />
<!-- 指定job的名称 -->
<property name="name" value="myJob" />
<!-- 指定job的分组 -->
<property name="group" value="jobs" />
<!-- 必须设置为true,如果为false,当没有活动的触发器与之关联时会在调度器中删除该任务 -->
<property name="durability" value="true"/>
<!-- 指定spring容器的key,如果不设定那么在job类中是获取不到spring容器里的对象的 -->
<property name="applicationContextJobDataKey" value="applicationContext"/>
</bean>
<!-- 另一种方式, 定义job和jobDetial, Job类为普通类即可
<!-- 配置job --
<bean id="myJob" class="com.zx.quartz.MyJob"/>
<!-- 配置jobDetail --
<bean id="myJobDetial" class="org.springframework.scheduling.quartz.MethodlnvokingJobDetaiLFactoryBean">
<property name="targetObject">
<ref bean="myJob" />
</property>
<property name="targetMethod"> <!-- 要执行的方法名 --
<value>execute</value>
</property>
</bean>
-->
<!-- 定义触发器 -->
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="myJobDetail" />
<!-- 每五秒执行一次 -->
<property name="cronExpression" value="0/5 * * * * ?" />
</bean>
<!-- 定义触发器, 一个job可以有多个trigger, 但一个trigger只能有一个job -->
<bean id="cronTrigger2" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="myJobDetail" />
<!-- 每一分钟执行一次 -->
<property name="cronExpression" value="0 */1 * * * ?" />
</bean>
<!-- 定义调度器 -->
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="cronTrigger" />
<ref bean="cronTrigger2" />
</list>
</property>
</bean>
4.