浅谈JobExecutionContext & JobDataMap

JobExecutionContext是什么?

  • 当Scheduler调用一个Job,就会将JobExecutionContext传递给Job的 execute() 方法;
  • Job能通过JobExecutionContext对象访问到Quartz运行时候的环境以及Job本身的明细数据。

JobDataMap是什么?

  • 在进行任务调度时JobDataMap存储在JobExecutionContext中,非常方便获取
  • JobDataMap可以用来装载任何可以序列化的数据对象,当Job实例对象被执行时,这些参数对象会传递给它。
  • JobDataMap实现了JDK的Map 接口,并且添加了一些非常方便的方法用来存储基本数据类型。

JobDataMap的获取方式

  •   方式一:从Map里面直接获取
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.TriggerKey;

public class HelloJob implements Job{

    public void execute(JobExecutionContext context) throws JobExecutionException {
        
        //打印当前的执行时间
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String currentTime = sdf.format(date);
        System.out.println("Current Exec Time : "+currentTime);
        //编写具体的业务逻辑        
        
        JobKey key = context.getJobDetail().getKey();
        System.out.println("my name is :"+key.getName()+" and group is:" +key.getGroup());
TriggerKey trkey
= context.getTrigger().getKey(); System.out.println("my name is: "+trkey.getName()+" and group is:"+trkey.getGroup());
JobDataMap dataMap
= context.getJobDetail().getJobDataMap(); JobDataMap tdataMap = context.getTrigger().getJobDataMap();
String jobMessage
= dataMap.getString("message"); Float FloatJobValue = dataMap.getFloat("FloatJobValue"); String triggerMessage = tdataMap.getString("message"); Double DoubleTriggerValue = tdataMap.getDouble("DoubleTriggerValue"
);
System.out.println(jobMessage); System.out.println(FloatJobValue); System.out.println(triggerMessage); System.out.println(DoubleTriggerValue); } }
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler {
    public static void main(String[] args) throws SchedulerException {
        //创建一个JobDetail实例,将该实例与HelloJob class绑定
        JobDetail jobDetail = JobBuilder.newJob(HelloJob.class)
                .withIdentity("myJob", "group1")
                .usingJobData("message", "hello myJob1")
                .usingJobData("FloatJobValue", 3.14f).build();
        //创建一个Trigger实例,定义该Job立即执行,并且每隔2秒钟重复执行一次,直到永远
        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("myTrigger", "group1")
                .usingJobData("message", "hello myTrigger1")
                .usingJobData("DoubleTriggerValue", 2.0D)
                .startNow().
                withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever())
                .build();
        //创建Scheduler实例
        SchedulerFactory sfact = new StdSchedulerFactory();
        Scheduler scheduler = sfact.getScheduler();
        scheduler.start();
        scheduler.scheduleJob(jobDetail, trigger);
    }

}
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.TriggerKey;

public class HelloJob implements Job{

    public void execute(JobExecutionContext context) throws JobExecutionException {
        
        //打印当前的执行时间
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String currentTime = sdf.format(date);
        System.out.println("Current Exec Time : "+currentTime);
        //编写具体的业务逻辑        
        
        JobKey key = context.getJobDetail().getKey();
        System.out.println("my name is :"+key.getName()+" and group is:" +key.getGroup());
        TriggerKey trkey = context.getTrigger().getKey();
        System.out.println("my name is: "+trkey.getName()+" and group is:"+trkey.getGroup());
        
        JobDataMap dataMap = context.getMergedJobDataMap();        
        
        String jobMessage = dataMap.getString("message");
        Float FloatJobValue = dataMap.getFloat("FloatJobValue");
        String triggerMessage = dataMap.getString("message");
        Double DoubleTriggerValue = dataMap.getDouble("DoubleTriggerValue");
        
        System.out.println(jobMessage);
        System.out.println(FloatJobValue);
        System.out.println(triggerMessage);
        System.out.println(DoubleTriggerValue);
    }

}

 方式二:Job实现类中添加setter方法对应JobDataMap的键值(Quartz框架默认的JobFactory 实现类在初始化job实例对象时会自动地调用这些setter方法)

package com.test.quartz.myquartz;

import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobDataMap;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.TriggerKey;

public class HelloJob implements Job{

     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 context) throws JobExecutionException {
        
        
        //打印当前的执行时间
        Date date = new Date();
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        String currentTime = sdf.format(date);
        System.out.println("Current Exec Time : "+currentTime);
        //编写具体的业务逻辑        
        
        JobKey key = context.getJobDetail().getKey();
        System.out.println("my name is :"+key.getName()+" and group is:" +key.getGroup());
        TriggerKey trkey = context.getTrigger().getKey();
        System.out.println("my name is: "+trkey.getName()+" and group is:"+trkey.getGroup());
        
        System.out.println("message is :" +message);
        System.out.println("FloatJobValue is :" +FloatJobValue);
        System.out.println("DoubleTriggerValue is :" +DoubleTriggerValue);
    }

}
原文地址:https://www.cnblogs.com/zhou-test/p/9720186.html