淺談Quartz的JobExecutionContext和JobDataMap
一 點睛
1 JobExecutionContext是什麼
-
當Scheduler呼叫一個Job,就會將JobExecutionContext傳遞給Job的execute()方法
-
Job能通過JobExecutionContext物件訪問到Quartz執行時候的環境以及Job物件的明細資料。
2 JobDataMap是什麼
-
在進行任務排程時JobDataMap儲存在JobExecutionContext中,非常方便獲取。
-
JobDataMap可以用來裝載任務可序列化的資料物件,當job例項物件被執行時這些引數物件會傳遞給它。
-
JobDataMap實現了JDK的Map介面,並且添加了一些非常方便的方法用來存取基本資料型別。
3 獲取JobDataMap的兩種方法
-
從Map中直接獲取
-
Job實現類中新增setter方法對應JobDataMap的鍵值(Quartz框架預設的JobFactory實現類在初始化job例項物件時會自動呼叫這些setter方法)
二 實戰——從Map中直接獲取
1 啟動類
package com.quartz; import org.quartz.*; import org.quartz.impl.StdSchedulerFactory; import java.text.SimpleDateFormat; import java.util.Date; public class HelloScheduler { public static void main(String[] args) throws SchedulerException { //建立一個JobDetail例項, 將該例項與hellojob class 繫結 JobDetail jobDetail = JobBuilder.newJob(HelloJob.class) .withIdentity("myJob").usingJobData("message","Hello myjob1") .usingJobData("FloatJobValue",3.14F).build(); //演示傳遞引數 //建立一個Trigger例項,定義該job立即執行,並且每隔兩秒鐘重複執行一次 Trigger trigger = TriggerBuilder.newTrigger().withIdentity("myTrigger","group1") .usingJobData("message","hello myTrigger1") .usingJobData("DoubleTriggerValue",2.0D) //演示傳遞引數 .startNow().withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(2).repeatForever() ).build(); //建立Schedule例項 SchedulerFactory schedulerFactory = new StdSchedulerFactory(); Scheduler scheduler = schedulerFactory.getScheduler(); scheduler.start(); Date date = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current Time is:" + simpleDateFormat.format(date)); scheduler.scheduleJob(jobDetail,trigger); } }
2 Job類
package com.quartz; import org.quartz.*; import java.text.SimpleDateFormat; import java.util.Date; /** * Created by kenfo on 2017/10/16. */ public class HelloJob implements Job{ public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException { //列印當前執行的時間 Date date = new Date(); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("+++++++++++++++++++++++++++"); System.out.println("Current Exec Time is:" + simpleDateFormat.format(date)); //演示通過jobExecutionContext傳遞引數 JobKey key = jobExecutionContext.getJobDetail().getKey(); System.out.println("My name and group are:"+key.getName()+":"+key.getGroup()); TriggerKey trkey = jobExecutionContext.getTrigger().getKey(); System.out.println("My trigger name and group are:"+key.getName()+":"+key.getGroup()); JobDataMap dataMap=jobExecutionContext.getJobDetail().getJobDataMap(); JobDataMap triDataMap=jobExecutionContext.getTrigger().getJobDataMap(); String jobMsg = dataMap.getString("message"); Float jobFloatValue=dataMap.getFloat("FloatJobValue"); String triMsg =triDataMap.getString("message"); Double triDoubleValue=triDataMap.getDouble("DoubleTriggerValue"); System.out.println("jobMsg"+jobMsg); System.out.println("jobFloatValue"+jobFloatValue); System.out.println("triMsg"+triMsg); System.out.println("triDoubleValue"+triDoubleValue); } }
3 測試結果
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-16 19:50:58
My name and group are:myJob:DEFAULT
My trigger name and group are:myJob:DEFAULT
jobMsgHello myjob1
jobFloatValue3.14
triMsghello myTrigger1
triDoubleValue2.0
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-16 19:51:00
My name and group are:myJob:DEFAULT
My trigger name and group are:myJob:DEFAULT
jobMsgHello myjob1
jobFloatValue3.14
triMsghello myTrigger1
triDoubleValue2.0
三 實戰——演示getMergedJobDataMap方法
1 Job類
package com.quartz;
import org.quartz.*;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by kenfo on 2017/10/16.
*/
public class HelloJob implements Job{
public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
//列印當前執行的時間
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("+++++++++++++++++++++++++++");
System.out.println("Current Exec Time is:" + simpleDateFormat.format(date));
//演示通過jobExecutionContext傳遞引數
JobKey key = jobExecutionContext.getJobDetail().getKey();
System.out.println("My name and group are:"+key.getName()+":"+key.getGroup());
TriggerKey trkey = jobExecutionContext.getTrigger().getKey();
System.out.println("My trigger name and group are:"+key.getName()+":"+key.getGroup());
//演示getMergedJobDataMap方法,Trigger的key優先級別高於jobDetail
JobDataMap dataMap=jobExecutionContext.getMergedJobDataMap();
String Msg = dataMap.getString("message");
Float jobFloatValue=dataMap.getFloat("FloatJobValue");
Double triDoubleValue=dataMap.getDouble("DoubleTriggerValue");
System.out.println("Msg is "+Msg); //Trigger中的msg會覆蓋掉jobDetail中msg
System.out.println("jobFloatValue:"+jobFloatValue);
System.out.println("triDoubleValue:"+triDoubleValue);
}
}
2 測試結果
Current Time is:2018-11-16 21:51:24
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-16 21:51:24
My name and group are:myJob:DEFAULT
My trigger name and group are:myJob:DEFAULT
Msg is hello myTrigger1
jobFloatValue:3.14
triDoubleValue:2.0
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-16 21:51:26
My name and group are:myJob:DEFAULT
My trigger name and group are:myJob:DEFAULT
Msg is hello myTrigger1
jobFloatValue:3.14
triDoubleValue:2.0
四 實戰——演示第二種方法setter獲得JobDataMap
1 Job類
package com.quartz;
import org.quartz.*;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* Created by kenfo on 2017/10/16.
*/
public class HelloJob implements Job{
//通過setter方法獲得datamap的值,跟傳入引數的key相同
private String message;
private Float FloatJobValue;
private Double DoubleTriggerValue;
public void setMessage( String message ) {
this.message = message;
}
public void setFloatJobValue( Float floatJobValue ) {
FloatJobValue = floatJobValue;
}
public void setDoubleTriggerValue( Double doubleTriggerValue ) {
DoubleTriggerValue = doubleTriggerValue;
}
public void execute( JobExecutionContext jobExecutionContext) throws JobExecutionException {
//列印當前執行的時間
Date date = new Date();
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println("+++++++++++++++++++++++++++");
System.out.println("Current Exec Time is:" + simpleDateFormat.format(date));
//演示通過jobExecutionContext傳遞引數
JobKey key = jobExecutionContext.getJobDetail().getKey();
System.out.println("My name and group are:"+key.getName()+":"+key.getGroup());
TriggerKey trkey = jobExecutionContext.getTrigger().getKey();
System.out.println("My trigger name and group are:"+key.getName()+":"+key.getGroup());
System.out.println("Msg is "+message); //Trigger中的msg會覆蓋掉jobDetail中msg
System.out.println("jobFloatValue:"+FloatJobValue);
System.out.println("triDoubleValue:"+DoubleTriggerValue);
}
}
2 測試結果
Current Time is:2018-11-16 21:47:39
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-16 21:47:39
My name and group are:myJob:DEFAULT
My trigger name and group are:myJob:DEFAULT
Msg is hello myTrigger1
jobFloatValue:3.14
triDoubleValue:2.0
+++++++++++++++++++++++++++
Current Exec Time is:2018-11-16 21:47:41
My name and group are:myJob:DEFAULT
My trigger name and group are:myJob:DEFAULT
Msg is hello myTrigger1
jobFloatValue:3.14
triDoubleValue:2.0