Quartz框架可以实现 异步定时任务。Quartz框架下载地址
注意1版本和2版本写法完全不一样,本文采用的是2-x版本
下载完毕后进入进入lib文件夹,然后将下面的几个jar引入项目:
基本实现步骤:
发布任务,编写触发器,编写调度器
任务一般写在Service层
package luzelong.service;
public class MeetingService {
public void calClassMeeting() throws InterruptedException {
System.out.println("需要提醒的任务(召开会议...)");
Thread.sleep(5000);
System.out.println("end....");
}
}
实现一个job接口
package luzelong.job;
import luzelong.service.MeetingService;
import org.quartz.*;
import java.util.List;
public class PlanJob implements Job {
MeetingService meetingService = new MeetingService();
@Override
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
try {
TriggerKey triggerKey = jobExecutionContext.getTrigger().getKey();
JobKey jobKey = jobExecutionContext.getJobDetail().getKey();
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();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
编写触发器,编写调度器直接在测试方法中写
package luzelong.test;
import luzelong.job.PlanJob;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
public class TestQuartz {
public static void main(String[] args) throws SchedulerException, InterruptedException, ParseException {
JobBuilder jobBuilder = JobBuilder.newJob(PlanJob.class);//包装原则
//产生实际使用的Job
JobDetail jobDetail = jobBuilder.withIdentity("meeting Job","group1").build();
//向Job的execute()中传入一些参数
JobDataMap jobDataMap = jobDetail.getJobDataMap();
List<String> names = Arrays.asList(new String[]{"zs","ls","ww"});
jobDataMap.put("infos",names);
//触发器:时间规则,依赖2个对象(TriggerBuilder,Scheduel)
TriggerBuilder<Trigger> triggerTriggerBuilder = TriggerBuilder.newTrigger();
triggerTriggerBuilder = triggerTriggerBuilder.withIdentity("meeting trigger", "group1");
triggerTriggerBuilder.startNow();//当满足条件时 立即执行
//下面的是给执行加一个时间限制
/* SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date start=sdf.parse("2020-05-13 11:43:20");
Date end = sdf.parse("2020-05-13 11:43:45");
triggerTriggerBuilder.startAt(start);
triggerTriggerBuilder.endAt(end);*/
//ScheduelBuilder:定义执行的周期(时机)
// SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule();
// scheduleBuilder.withIntervalInSeconds(1);//单位秒,每隔两秒执行一次
// scheduleBuilder.withRepeatCount(10);//执行10+1次
//上面是简单触发器 下面的触发器 每分钟的5 10 20 30 35 秒都会执行
CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule("5,10,20,30,35 * * * * ? *");
//产生触发器
// SimpleTrigger trigger = triggerTriggerBuilder.withSchedule(scheduleBuilder).build();
CronTrigger trigger = triggerTriggerBuilder.withSchedule(cronScheduleBuilder).build();
//调度器(工厂产生调度器)
SchedulerFactory factory = new StdSchedulerFactory();
//产生调度器
Scheduler scheduler = factory.getScheduler();
//通过 调度器将 任务 和 触发器一一对应
scheduler.scheduleJob(jobDetail,trigger);
scheduler.start();
// Thread.sleep(10000);
// scheduler.shutdown();
//scheduler.shutdown(false):跟上面一样都是 立即关闭
//scheduler.shutdown(true):将当前任务执行完毕后 再关闭
}
}
上面的CronScheduleBuilder的cronSchedule方法括号里面写的是cron表达式