简介
Quartz:定时任务
Quartz :定时异步任务
概念
任务:做什么事情…. StudentService
触发器:定义时间
调度器:将任务、触发器 一一对应】
实现步骤:(独立使用)
jar
jar 在quartz-2.2.1-distribution的lib中
编写
任务
public class MeetingService {
public void calClassMeeting(){
System.out.println("需要提醒的任务(召开会议....)");
// try {
// Thread.sleep(5000);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
// System.out.println("end.....");
}
}
Job
public class PlanJob implements Job {
MeetingService meetingService = new MeetingService();
//jobExecutionContext可以获取 设置的各种参数值
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
TriggerKey triggerkey =
jobExecutionContext.getTrigger().getKey();
JobKey jobKey = jobExecutionContext.getJobDetail().getKey();
System.out.println("----");
System.out.println(triggerkey+"\n"+jobKey);
JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
List<String> infos = (List<String>)jobDataMap.get("infos");
System.out.println(infos);
//存放 计划执行的任务...
meetingService.calClassMeeting();
}
}
3.测试方法:Job 、 触发器 、调度器
public class TestQuartz {
//XxxBuilder ->withIdentity()-->Xxx
public static void main(String[] args) throws SchedulerException, InterruptedException, ParseException {
// PlanJob
JobBuilder jobBuilder = JobBuilder.newJob(PlanJob.class);//PlanJob PlanJob PlanJob
//产生实际使用的Job
JobDetail jobDetail = jobBuilder.withIdentity("meeting Job", "group1").build();
//向Job的execute()中传入一些参数。。。
// JobDatMap
JobDataMap jobDataMap = jobDetail.getJobDataMap();
List<String> names = Arrays.asList(new String[]{"zs","ls","ww"});
jobDataMap.put("infos",names);
// 触发器(Trigger):时间规则 ,依赖2个对象(TriggerBuilder ,Scheduel)
TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger();
triggerBuilder = triggerBuilder.withIdentity("meeting trigger", "group1");
triggerBuilder.startNow();//当满足条件时 立刻执行
// 2019-03-13 09:46:30 -- // 2019-03-13 09:46:45
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date start = sdf.parse("2019-03-13 09:46:30");
Date end = sdf.parse("2019-03-13 09:46:45");
// triggerBuilder.startAt(start);
// triggerBuilder.endAt(end);
//scheduelBuilder:定执行的周期(时机)
// SimpleScheduleBuilder scheduelBuilder = SimpleScheduleBuilder.simpleSchedule();
// scheduelBuilder.withIntervalInSeconds(1) ;//每隔1秒执行一次
// scheduelBuilder.withRepeatCount(300) ;//重复执行3次
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("5,10,15,30,45 * * * * ? *");
//产生触发器
CronTrigger trigger = triggerBuilder.withSchedule(cronScheduleBuilder).build();
// 调度器(工厂产生调度器)
SchedulerFactory secheduleFacotry = new StdSchedulerFactory();
//产生调度器
Scheduler scheduler = secheduleFacotry.getScheduler();
//通过调度器 将 任务 和 触发器一一对应
scheduler.scheduleJob(jobDetail,trigger) ;
scheduler.start();
// scheduler.shutdown(true);
}
}
scheduler.shutdown():立刻关闭
scheduler.shutdown(false):shutdown()立刻关闭
scheduler.shutdown(true):将当前任务执行完毕后 再关闭
异步任务
触发器:CronScheduleBuilder
Cron表达式:
6-7个个参数,以空格隔开
秒 分 时 天(月) 月 天(周) (年)
Spring整合Quartz
jar
spring基础包(spring-context-support.jar/spring-tx.jar)+quartz
编写
将Job信息封装到一个 实体类中
public class ScheduleJob {
//id
private String jobId ;
private String jobName ;
private String jobGroup ;
private String jobStatus ;//0:禁用 1启用 2删除
private String cronExpression ;
private String desc ;
public String getJobId() {
return jobId;
}
public void setJobId(String jobId) {
this.jobId = jobId;
}
public String getJobName() {
return jobName;
}
public void setJobName(String jobName) {
this.jobName = jobName;
}
public String getJobGroup() {
return jobGroup;
}
public void setJobGroup(String jobGroup) {
this.jobGroup = jobGroup;
}
public String getJobStatus() {
return jobStatus;
}
public void setJobStatus(String jobStatus) {
this.jobStatus = jobStatus;
}
public String getCronExpression() {
return cronExpression;
}
public void setCronExpression(String cronExpression) {
this.cronExpression = cronExpression;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
}
spring配置文件
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="scheduleJobEntity" class="com.yanqun.entity.ScheduleJob" >
<property name="jobId" value="j001"></property>
<property name="jobName" value="任务1"></property>
<property name="jobGroup" value="任务组1"></property>
<property name="jobStatus" value="1"></property>
<property name="cronExpression" value="5,10,30,50 * * * * ? *"></property>
<property name="desc" value="描述..."></property>
</bean>
<bean id="jobDetail" class="org.springframework.scheduling.quartz.JobDetailFactoryBean" >
<property name="jobClass" value="com.yanqun.job.PlanJob">
</property>
<property name="jobDataAsMap">
<map>
<entry key="scheduleJob">
<ref bean="scheduleJobEntity"></ref>
</entry>
</map>
</property>
</bean>
<!-- 触发器:定义时间规则
<bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobDetail" >
</property>
<property name="cronExpression" value="#{scheduleJobEntity.cronExpression}">
</property>
</bean>
-->
<!--SimpleTrigger-->
<bean id="simpleTrigger" class="org.springframework.scheduling.quartz.SimpleTriggerFactoryBean" >
<property name="repeatInterval" value="2000"></property>
<property name="repeatCount" value="10"></property>
<property name="startDelay" value="3"></property>
<property name="jobDetail" ref="jobDetail" >
</property>
</bean>
<bean id="schedulerFactoryBean" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="simpleTrigger" />
</list>
</property>
</bean>
</beans>
要做的事情
public class PlanJob implements Job {
private MeetingService meetingService = new MeetingService() ;
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
meetingService.remindMeeting(); ;
JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();
ScheduleJob job = (ScheduleJob)jobDataMap.get("scheduleJob");
System.out.println(job.getJobId());
System.out.println(job.getJobName());
}
}
测试
public class TestQuartzSpring {
public static void main(String[] args) throws SchedulerException {
//singleton:容器初始化时
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
// StdScheduler scheduler = (StdScheduler)context.getBean("schedulerFactoryBean");
// scheduler.start();SchedulerFactoryBean默认会在实例化时自动启动(singleton的bean会会在ioc容器初始化时 自动加载)
}
}
调度器 ->触发器(Job、执行时间)