1. 程式人生 > >淺談Quartz的JobExecutionContext和JobDataMap

淺談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