浅谈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

 

 

  • 0
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值