quartz 定时任务的总结(二)
简单了解quartz 概念,知道它干什么之后,
我们开始代码之前先了解这几个对象:
1、Job
表示一个工作,要执行的具体内容。此接口中只有一个方法
void execute(JobExecutionContext context)
2、JobDetail
JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。
3、Trigger代表一个调度参数的配置,什么时候去调。
4、Scheduler代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。
1.首先导入quartz的jar
<!-- quartz 的jar --> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz</artifactId> <version>2.2.1</version> </dependency> <dependency> <groupId>org.quartz-scheduler</groupId> <artifactId>quartz-jobs</artifactId> <version>2.2.1</version> </dependency>
2.创建一个Myjob implements Job接口
public class MyJob implements Job { //获取JobDataMap的两种方式: //1.可以通过定义属性, 来获取JobDataMap 的值,不过定义的属性名必须和JobDataMap的key值一样,创建setter getter 方法,就可以直接使用! 如果JobDetail里面的JobDataMap的key值与trigger的key值一样,只能拿到trigger的jobdatamap 的value //2. 通过JobExecutionContext 对象 来获取, context.getJobDetail().getJobDataMap(); context.getTrigger().getJobDataMap(); 然后通过get("key值") 就可以获得 /*private String message; public String getMessage() { return message; }*/ /* public void setMessage(String message) { this.message = message; }*/ @Override public void execute(JobExecutionContext context) throws JobExecutionException { Date date = new Date(); SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH : mm: ss"); format.format(date); JobKey jobKey = context.getJobDetail().getKey(); String name = jobKey.getName(); String group = jobKey.getGroup(); System.out.println("此任务的name: " + name + "组名称 :"+ group + "在"+format.format(date) + "开始运行!"); JobDataMap jobDataMap = context.getJobDetail().getJobDataMap(); System.out.println("获取JobDetailMap 的message 的值:" + jobDataMap.get("message") ); } }
3编写测试类
MyFristTest类:
public static void main (String[] args){ //下面的.usingJobData("message","job1使用的jobDetailmap") 就是给JobDataMap 里面添加key,value; //jobDetail trigger 都是bulider模式创建,通过.withIdentity("job01","group1") 方式设置 name, group,quartz的机制是一个job可以有多个trigger,但是一个trigger只能有一个job。 JobDetail jobDetail = JobBuilder.newJob(MyJob.class).withIdentity("job01","group1").usingJobData("message","job1使用的jobDetailmap").build(); //设定时间戳 启动3秒后开始执行,时间间隔是每两秒执行一次 long currentTimeMillis = System.currentTimeMillis(); SimpleDateFormat format = new SimpleDateFormat("yyyy- MM -dd HH:mm:ss"); System.out.println("当前时间是:"+ format.format(new Date())); currentTimeMillis += 3000; Date date = new Date(currentTimeMillis); SimpleDateFormat format1 = new SimpleDateFormat("yyyy- MM -dd HH:mm:ss"); System.out.println("开始时间是:"+ format1.format(date)); /* try { Thread.sleep(3000); } catch (InterruptedException e) { e.printStackTrace(); }*/ Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger01","triggerGroup01").withSchedule(SimpleScheduleBuilder.repeatSecondlyForever(2)).startAt(date).build(); //获取Scheduler调度器, SchedulerFactory sf = new StdSchedulerFactory(); try { Scheduler scheduler =sf.getScheduler(); //开始调度 scheduler.start(); //调度jobDetail和trigger scheduler.scheduleJob(jobDetail,trigger); } catch (SchedulerException e) { e.printStackTrace(); }
4.运行结果: