Quartz之JobDetail与JobDataMap

Job实例在Quartz中的生命周期

每次调度器执行Job时,它在调用execute方法前会创建一个新的Job实例。(前提是该Job实例是由JobDetail创建)。

当调用完成后,关联的Job对象实例会被释放,释放的实例会被垃圾回收机制回收。

浅谈JobDetail

JobDetail为Job实例提供了许多设置属性,以及JobDataMap成员变量属性,它用来存储特定Job实例的状态信息,调度器需要借助JobDetail对象来添加Job实例。

JobDetail重要属性:

  • name
  • group (如果不设置,默认置为:DEFAULT)
  • jobClass
  • jobDataMap

name、group、jobClass三个属性获取方式:

JobDetail jobDetail=JobBuilder.newJob(HelloJob.class)
									.withIdentity("myJob", "group1").build();
		
		System.out.println(jobDetail.getKey().getName());
		System.out.println(jobDetail.getKey().getGroup());
		System.out.println(jobDetail.getClass().getName());

浅谈JobExecutionContext

JobExecutionContext是什么:

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

JobDataMap是什么:

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

获取JobDataMap的两种方式

  1. 从Map中直接获取
    首先在JobDetail中设置值
JobDetail jobDetail=JobBuilder.newJob(HelloJob.class)
									.withIdentity("myJob", "group1")
									.usingJobData("message","hello job")   //在JobDetail中设置值
									.usingJobData("jobKey","is job")	//在JobDetail中设置值
									.build();

然后在Trigger中设置值

Trigger trigger=TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")//定义name/group
							.usingJobData("message", "hello trigger")   //在Trigger中设置值
							.usingJobData("triggerKey", "is trigger")   //在Trigger中设置值
							.startNow()  //一旦加入schedular,立即生效
							.withSchedule(SimpleScheduleBuilder.simpleSchedule() //使用SimpleTrigger
												.withIntervalInSeconds(2) //每隔两秒执行一次
												.repeatForever() //一直执行,直到程序死去
												).build();

最后在job实例中获取先前设置的值

		JobKey key=context.getJobDetail().getKey();
		String jobName=key.getName();  //获取JobDetail的name;
		String jobGroup=key.getGroup();  //获取JobDetail的group;
		
		TriggerKey trKey=context.getTrigger().getKey();
		String triggerName=trKey.getName();  //获取Trigger的name;
		String triggerGroup=trKey.getGroup();   //获取Trigger的group;
		
		//第一种方式获取值
		//获取JobDetail中的值
		JobDataMap dataMap=context.getJobDetail().getJobDataMap();
		String k1= dataMap.getString("message");
		String k2= dataMap.getString("jobKey");
		//获取Trigger中的值
		JobDataMap trDataMap=context.getTrigger().getJobDataMap();
		String t1=trDataMap.getString("message");
		String t2=trDataMap.getString("triggerKey");
		
		System.out.println("jobName:"+jobName+"jobGroup:"+jobGroup
							+"triggerName:"+triggerName+"triggerGroup:"+triggerGroup
							+k1+k2+t1+t2);

这第一种方式除了这种方法获取,还有一种方法,这种方法是将JobDetail与Trigger中设置的融合到一个JobDataMap中:

//第一种方式的第二种方法获取值
		JobDataMap dataMap=context.getMergedJobDataMap();
		String msg=dataMap.getString("message");  //如果JobDetail与Trigger中设置的key值一样,则Trigger中会覆盖JobDetail中的值
		String jobKey=dataMap.getString("jobKey");
		String triggerKey=dataMap.getString("triggerKey");
		
		System.out.println(jobName+jobGroup+msg+jobKey+triggerKey);
  1. Job实现类中添加setter方法对应JobDataMap的键值(Quartz框架默认的JobFactory实现类在初始化Job实例对象时会自动地调用这些setter方法)
    创建对应的成员变量:
	private String message;
	private String jobKey;
	private String triggerKey;

生成对应的getter与setter方法,然后就可以获取了。

猜你喜欢

转载自blog.csdn.net/qq_38962739/article/details/88881008