Quatz
主要用到的设计模式
Builder模式
Factory模式
组件模式
三个核心概念
调度器
任务
触发器
重要组成
重要组成(JOB TRIGGER SCHEDULER)
Job 实现任务
JobDetail Quartz每次执行job的时候都会创建一个job实例
JobBuilder 创建JobDetail实例
JobStore 存储Job数据
Trigger 触发规则
TriggerBuilder
ThreadPool
Scheduler
监听器
JobListener
TriggerListener
SchedulerListener
Job创建
public class HelloJob implements Job { @Override public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { //打印当前执行时间 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); Calendar calendar = Calendar.getInstance(); System.out.println(simpleDateFormat.format(calendar.getTime())); //编写具体的业务逻辑 System.out.println("hello world"); } }
JobDetail Trigger Scheduler
//withIdentity 定义唯一标识 public class HelloScheduler { public static void main(String[] args) { //创建一个JobDetail实例 将该实例与JelloJob绑定 //Build模式 JobDetail jobDetail = JobBuilder.newJob(HelloJob.class) .withIdentity("myJob", "group1").build(); //创建一个Trigger实例,定义该Job立即执行 每隔两面重复一次 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1") // 从现在开始执行 执行频度 .startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()).build(); // 创建Scheduler 实例 工厂模式 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); //绑定jobDetail 和 trigger scheduler.scheduleJob(jobDetail,trigger); scheduler.start(); System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())); } }
Job 实例在Quartz中的生命周期
每次调度器执行job时候 在调用Execute方法前会创建一个新的job实例
当调用完成以后 关联job实例的对象会被释放 回收
JobDetail为Job实例提供了许多设置属性,以及JobDataMap成员变量属性
它用来存储特定的Job实例状态信息,调度器需要借助JobDetail来添加Job实例
System.out.println("name:"+jobDetail.getKey().getName()); System.out.println("group:"+jobDetail.getKey().getGroup()); System.out.println("jobclass: "+jobDetail.getJobClass().getName());
JobExecutionContext
当Scheduler调用一个Job 就会将JobExecutionContext 传递给Job的Execute方法
Job能通过这个访问到Quartz运行时候的环境以及Job本身的明细数据
JobDataMap
进行任务调度的时候JobDataMap 存储在JobExecutionContext中 非常方便获取
获取JobDataMap
1:从Map中直接获取
JobDetail jobDetail = jobExecutionContext.getJobDetail(); System.out.println(jobDetail.getJobDataMap().get("message")); //合并dataMap jobExecutionContext.getMergedJobDataMap();
Job 实现类中添加setter方法对应JobDataMap的键值
//在job实现类中 private String message; //设置setter方法 xxxxx
Trigger
JobKey
StartTime
EndTime
JobKey
表示Job的实例标识 触发器被触发的时候 该指定的job实例会执行 获取的jobDetail的相关信息
StartTime
首次被触发的时间
EndTime
不在被触发的时间
Trigger trigger = jobExecutionContext.getTrigger(); JobKey jobKey = trigger.getJobKey(); System.out.println("startTime "+trigger.getStartTime()); System.out.println("endTime "+trigger.getEndTime());
SimpleTrigger
在一个指定时间段内执行一次作业任务
或者是在指定的时间间隔内多次执行作业任务
4秒中之后执行且仅仅执行一次任务
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1") .startAt(date).build();
4秒中之后执行一次任务 之后每隔两秒钟执行一次任务
SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1") .startAt(date) .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY)) .build();
withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY) 可以重复的次数 SimpleTrigger.REPEAT_INDEFINITELY 无限次
CronTrigger
基于日历的作业调度器
Cron 表达式
用于配置CronTrigger实例,是由7个子表达式组成的字符串,描述了时间表的详细信息。
格式 【秒】【分】【小时】【日】【月】【周】【年】
CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1") //? 代表不考虑 .withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ? *")) .build();
Scheduler 的创建方式
//StdSchedulerFactory SchedulerFactory schedulerFactory = new StdSchedulerFactory(); //DirectScheduler DirectSchedulerFactory directSchedulerFactory = DirectSchedulerFactory.getInstance();
主要函数
scheduleJob
返回的是一个Date类型 可以看见下一次执行的时间
start
standby
暂时暂停
shutdown
传入参数 true 表示等待所有正在执行的job执行完毕后 再关闭scheduler
false 直接关闭
关闭 无法再次重启
Quartz.properties
调度器属性
线程池属性
作业存储设置
插件设置
整合Spring
两种方式
MethodInvokingJobDetailFactoryBean 直接配置调用哪个Bean的哪个方法
JobDetailFactoryBean 需要给作业传递数据的时候 Job方法要继承
MethodInvokingJobDetailFactoryBean
<!-- 简单的配置 -->
<bean id="simpleJobDetail" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<!-- 任务Bean -->
<property name="targetObject" ref="myBean"/>
<!-- 任务的方法 -->
<property name="targetMethod" value="printMessage"/>
</bean>
JobDetailFactoryBean 需要给作业传递数据的时候 Job方法要继承
<bean id="firstComplexJobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean">
<property name="jobClass" value="com.cslg.controller.FirstScheduleJob"/>
<property name="jobDataAsMap">
<map>
<entry key="anotherBean" value-ref="anotherBean"/>
</map>
</property>
<!-- 如果一个任务不是durable,那么当没有Trigger关联它的时候,它就会被自动删除。-->
<property name="durability" value="true"/>
</bean>
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean">
<property name="jobDetail" ref="simpleJobDetail"/>
<property name="startDelay" value="1000"/>
<property name="repeatInterval" value="2000"/>
</bean>
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="simpleJobDetail"/>
<property name="cronExpression" value="0/5 * * ? * * "/>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="jobDetails">
<list>
<!-- <ref bean="simpleJobDetail"/>-->
<ref bean="firstComplexJobDetail"/>
</list>
</property>
<property name="triggers">
<list>
<!-- <ref bean="simpleTrigger"/>-->
<ref bean="cronTrigger"/>
</list>
</property>
</bean>
AnotherBean
@Component("anotherBean")
public class AnotherBean {
public void printMessage() {
System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
System.out.println("another Execute");
}
}
//FirstScheduleJob
public class FirstScheduleJob extends QuartzJobBean {
private AnotherBean anotherBean;
public void setAnotherBean(AnotherBean anotherBean){
this.anotherBean = anotherBean;
}
@Override
protected void executeInternal(JobExecutionContext jobExecutionContext) throws JobExecutionException {
this.anotherBean.printMessage();
}
}
整合所需要的jar包
<dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.3.2</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context-support</artifactId> <version>5.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-nop</artifactId> <version>1.7.21</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-context</artifactId> <version>5.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-tx</artifactId> <version>5.2.4.RELEASE</version> </dependency> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-core</artifactId> <version>5.2.4.RELEASE</version> </dependency>