从上面两篇文章看出,Job 的实现很简单,该接口只有一个 execute 方法。这一节我们主要关注以下三点:

  1. Job 特点
  2. Job 的 execute 方法
  3. JobDetail

Job 初窥

首先我们回过头看看 教程一 中的代码片段

JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("dummyJobName", "group1").build();Trigger trigger = TriggerBuilder.newTrigger().withIdentity("dummyTriggerName", "group1").withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(5).repeatForever()).build();sched.scheduleJob(job, trigger);

HelloJob类定义如下

public class HelloJob implements Job {@Overridepublic void execute(JobExecutionContext arg0) throws JobExecutionException {System.out.println(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date())+"Hello Quartz!");   }}

可以看到,我们传给 scheduler 一个 JobDetail 实例,因为我们在创建 JobDetail 时,将要执行的 job 的类名传给了 JobDetail,所以 scheduler 就知道了要执行何种类型的 job;

当 scheduler 执行 job 时,在调用其 execute() 方法之前会创建该类的一个新的实例,执行完毕,该实例的饮用就会被丢弃,实例会被垃圾回收。这种执行策略带来的后果就是,job 必须有一个无参的构造函数;另一个是,在 job 类中,不应该定义有状态的数据属性,因为 job 多次执行中,这些属性的值不会保留。

那么如何给 job 实例增加属性或配置呢?如何在 job 多次执行中,跟踪 job 的状态呢?答案就是 JobDataMap

JobDataMap

JobDataMapMap 中可以包含不限量的(序列化)数据对象,在 job 实例执行的时候,可以使用其中的数据;JobDataMap 是 Java Map 接口的一个实现,额外增加了一些便于存取的基本数据类型的方法。

将 job 加入到 scheduler 之前,在构建 JobData 时,可以将数据放入 JobDataMap,如下:

JobDetail job = newJob(DumbJob.class).withIdentity("myJob", "group1") // name "myJob", group "group1".usingJobData("jobSays", "Hello World!").usingJobData("myFloatValue", 3.141f).build();

在 job 执行过程中,可以从 JobDataMap 中取出数据,如下:

 public class DumbJob implements Job {public DumbJob() {}public void execute(JobExecutionContext context)throws JobExecutionException{JobKey key = context.getJobDetail().getKey();JobDataMap dataMap = context.getJobDetail().getJobDataMap();String jobSays = dataMap.getString("jobSays");float myFloatValue = dataMap.getFloat("myFloatValue");System.err.println("Instance " + key + " of DumbJob says: " + jobSays + ", and val is: " + myFloatValue);}
}

如果你使用的是持久化存储机制,再决定 JobDataMap 中存放什么数据的时候需要小心,因为 JobDataMap 中存储对象都会被序列化,因此很可能会导致类的版本不一致问题;Java 的标准类型都很安全,如果一斤有一个类的序列化后的实例,某个时候,鄙人修改了该类的定义,此时你需要确保对类的修改没有破坏兼容性;

Job 实例

你可以只创建一个 job 类,然后创建多个与该 job 类关联的 JobDetail 实例,每一个实例都有自己的属性集和 JobDataMap,最后,将所有的实例都加到 scheduler中。

比如,你创建了一个实现 Job 接口的类 “SaleReportJob” 。该 job 需要一个参数(通过 JobDataMap 传入),表示负责该销售报告的销售员名字。因此,你可以创建该 job 的多个实例(JobDetail),比如“SalesReportForJoe”、“SalesReportForMike”。将 “joe”、“mike” 作为 JobDataMap 的数据传给对应的 job 实例。

当一个 tigger 被触发时候,与之关联的 JobDetail 实例会被加载,JobDetail 引用的 job 类通过配置在 Scheduler 上的 JobFactory 进行初始化。默认的 JobFactory 实现,仅仅是调用 job 的 newInstance() 方法,然后尝试调用 JobDataMap 中的 key 的 setter 方法。

三:Job 和 JobDetail 详细介绍相关推荐

  1. 用python操作浏览器的三种方式,详细介绍并附代码

    第一种:selenium导入浏览器驱动,用get方法打开浏览器,例如: import time from selenium import webdriver def mac():     driver ...

  2. 【零基础玩转BLDC系列】无刷直流电机无位置传感器三段式启动法详细介绍及代码分享

    无刷直流电动机基本转动原理等内容请参考<基于霍尔传感器的无刷直流电机控制原理>.<基于反电动势过零检测法的无刷直流电机控制原理>与<以GD32F30x为例定时器相关功能详 ...

  3. 第九届蓝桥杯java B组—第三题复数幂(详细介绍)

    文章目录 1.题目如下 2.代码实例 3.结果如下 4.代码讲解 5.详细讲解文件输出 1.题目如下 设i为虚数单位.对于任意正整数n,(2+3i)^n 的实部和虚部都是整数. 求(2+3i)^123 ...

  4. python编程模式是什么_python 开发的三种运行模式详细介绍

    Python 三种运行模式 Python作为一门脚本语言,使用的范围很广.有的同学用来算法开发,有的用来验证逻辑,还有的作为胶水语言,用它来粘合整个系统的流程.不管怎么说,怎么使用python既取决于 ...

  5. linux的RPM支持图片格式,Linux下rpm、yum和源码三种安装方式详细介绍

    第1章 源码安装 源码包安装会比RPM包安装慢,是因为RPM的软件包是根据特定系统和平台而指定的,经常一种 程序会提供很多RPM包的格式,用户根据系统情况选择适合的RPM包直接安装,而源码包相当于 通 ...

  6. smart 3D 中的block merge(空三合并)功能详细介绍

    声明:时隔一年之久没有继续更博,今日受疫情影响不能外出办公,浏览推送出来的博客,发现有笔友做了标题功能的叙述,大概看了下,做出一些补充,方便大家实际作业能够直接使用.同时,希望兄弟姐妹们响应号召,做好 ...

  7. 发那科机器人点位编辑_发那科机器人指令编辑详细介绍

    程序编辑界面,在编辑(EDCMD)中有一系列的功能选项,本文重点对"变更编号"."取消"及"改为备注"三个功能做详细介绍. 1.变更编号(R ...

  8. 三次握手和四次挥手详细介绍

    相对于SOCKET开发者,TCP创建过程和链接折除过程是由TCP/IP协议栈自动创建的.因此开发者并不需要控制这个过程.但是对于理解TCP底层运作机制,相当有帮助. 而且对于有网络协议工程师之类笔试, ...

  9. 抓包工具 - Wireshark(详细介绍与TCP三次握手数据分析)

    功能使用的详细介绍 wireshark(官方下载网站: http://www.wireshark.org/),是用来获取网络数据封包,可以截取各种网络封包,显示网络封包的详细信息,包括http,TCP ...

最新文章

  1. 【新书】分布式强化学习
  2. 每日一道面试题(第7期)---Android补间动画与属性动画的区别
  3. C# 循环语句 for循环
  4. java标志清理_JVM内存管理之GC算法精解(五分钟让你彻底明白标记/清除算法)...
  5. VC++6.0和VC++2010的区别
  6. PHP面试题:对于用户输入一串字符串$string,要求$string中只能包含大于0的数字和英文逗号,请用正则 表达式验证,对于不符合要求的$string返回出错信息
  7. 手机没电不用慌 荣耀门店推充电站服务为你解忧
  8. Android系统下内存使用情况与监测
  9. vim 全局替换_高效操作:vim 快速删除空行和注释
  10. java 钩子 64位 操作系统_Java与系统钩子
  11. unity shader base pass and additional pass
  12. JSP连接SQLServer数据库特别要注意一个小问题得到解决
  13. flume学习(九):使用Morphline Interceptor
  14. 中国农业大学计算机考研复试分数线,2020中国农业大学考研复试分数线已公布...
  15. docker仓库的搭建居然只要一分钟!
  16. 物联网-位置信息、定位技术与位置服务
  17. MIDI模式设定演奏起始小节等其它要点
  18. SDCC 2017·深圳站八大不容错过的理由
  19. 阿里、字节跳动再度发力游戏,腾讯、网易怕了吗?
  20. 日常学习之:使用均值来填补缺失值的条件

热门文章

  1. Pyhton语言介绍
  2. Excel公式大全加详解
  3. JavaEE 企业级分布式高级架构师(十五)FastDFS分布式文件服务器(1)
  4. Base64处理byte[ ]和base64字符串之间的转换
  5. 东方财富股吧标题爬取分析
  6. 链路聚合+MSTP实验
  7. SOCKET的 10035错误
  8. 2021云栖大会丨果断收藏!「混合云参会指南」来啦
  9. 可道云上传文件后报错
  10. 刨根问底之链表数据结构