当前位置: 首页 > news >正文

Quartz 核心

一、Quartz 核心

工作原理:
  1. Scheduler 是一个计划调度器容器(总部),容器里面可以盛放众多的 JobDetailTrigger。当容器启动后,里面的每个 JobDetail 都会根据 Trigger 按部就班自动去执行。
  2. JobDetail 是一个可执行的工作,它本身可能是有状态的。
  3. Trigger 代表一个调度参数的配置,什么时候去调。
  4. JobDetailTriggerScheduler 容器上注册后,形成了装配好的作业(JobDetailTrigger 所组成的一对儿),就可以伴随容器启动而调度执行了。
  5. Scheduler 是个容器,容器中有一个线程池,用来并行调度执行每个作业,这样可以提高容器效率。
概念详解:
  1. Job

    • 作业是一个执行任务的简单 Java 类。任务可以是任何 Java 代码。只需实现 org.quartz.Job 接口,并将需要执行的任务代码写在 execute() 方法中即可。当 Quartz 确定该是作业运行的时候,它将调用你的作业。Quartz 提供了一个机制来建立具有不同粒度的、可重复的调度表,于是,你只需创建一个 Java 类,这个类被调用而执行任务。
    public interface Job {void execute(JobExecutionContext context) throws JobExecutionException;
    }Class MyJob implements Job {@Override void execute(JobExecutionContext context) { // 任务执行代码}
    }
    
  2. JobDetail

    • JobDetail 对象由 Quartz 客户端在 Job 被加入到 Scheduler 时创建。它包含了 Job 的各种设置属性以及一个 JobDataMap 对象,这个对象被用来存储给定 Job 类实例的状态信息。Scheduler 并不保存真正的 Job Class,而是通过 JobDetail 来保存。
    • 注意,给 Scheduler 传入了一个 JobDetail 实例,而且这个 JobDetail 实例只是简单提供了类名来引用被执行的 Job。每次 Scheduler 执行这个任务时,它就创建这个类的新实例,然后调用该实例的 execute(..) 方法。Job 不必担心线程安全性,因为同一时刻仅有一个线程去执行给定 Job 类的实例,甚至是并发执行同一 Job 也是如此。
  3. JobFactory

    • JobFactory 控制 Job 的实例化
    Job newJob(TriggerFiredBundle bundle) throws SchedulerException;
    
    • 默认的 JobFactoryorg.quartz.simpl.SimpleJobFactory,缺省的 JobFactory 只是简单地对 Job 类调用 newInstance() 方法。
    • 设置 JobFactory
    scheduler.setJobFactory(factory);
    
    • 配置 quartz.propertiesorg.quartz.scheduler.jobFactory.class 属性设置 JobFactory 的类型
  4. JobDataMap

    • JobDataMap 被用来保存一系列的(序列化的)对象,这些对象在 Job 执行时可以得到。JobDataMap 是 Java Map 接口的一个实现,而且还增加了一些存储和读取主类型数据的便捷方法。
    • 设置:
    JobDetail.getJobDataMap().put("jobSays", "Hello World!");
    
    • 获取:
      1. JobExecutionContext.getJobDetail().getJobDataMap();
      2. Trigger.getJobDataMap();
      3. JobExecutionContext.getMergedJobDataMap();
  5. StatefulJob

    • 有状态任务在执行任务过程中,任何对 JobDataMap 所作的更改都将丢失而且任务下次执行时也无法看到。
    • StatefulJob 在任务的每次执行之后重新存储 JobDataMap
  6. Trigger(触发器)

    • Trigger 对象被用来触发 jobs 的执行。你希望将任务纳入到进度,要实例化一个 Trigger 并且“调整”它的属性以满足你想要的进度安排。Triggers 也有一个 JobDataMap 与之关联,这非常有利于向触发器所触发的 Job 传递参数。Quartz 打包了很多不同类型的 Trigger, 最常用的 Trigger 类是 SimpleTriggerCronTrigger
      在这里插入图片描述
  7. SimpleTrigger

    • SimpleTrigger 用来触发只需执行一次或者在给定时间触发并且重复 N 次且每次执行延迟一定时间的任务。
    • 例如,如果你想让触发器在2010年1月11日,上午11:23:54秒执行,然后每隔10秒钟重复执行一次,并且这样重复5次,那么 SimpleTrigger 就可以满足你的要求。
  8. CronTrigger

    • 如果你需要像日历那样按日程来触发任务,而不是像 SimpleTrigger 那样每隔特定的间隔时间触发,CronTriggers 通常比 SimpleTrigger 更有用。
    • 使用 CronTrigger,你可以指定诸如“每个周五中午”,或者“每个工作日的9:30”或者“从每个周一、周三、周五的上午9:00到上午10:00之间每隔五分钟”这样日程安排来触发。甚至,象 SimpleTrigger 一样,CronTrigger 也有一个 startTime 以指定日程从什么时候开始,也有一个(可选的)endTime 以指定何时日程不再继续。
    public CronTrigger(String name, String group, String jobName, String jobGroup, Date startTime, Date endTime, String cronExpression, TimeZone timeZone) throws ParseException;
    

    在这里插入图片描述

  9. Cron Expressions

    • Cron 表达式被用来配置 CronTrigger 实例。Cron 表达式是一个由7个子表达式组成的字符串。每个子表达式都描述了一个单独的日程细节。这些子表达式用空格分隔,分别表示:
      • Seconds 秒
      • Minutes 分钟
      • Hours 小时
      • Day-of-Month 月中的天
      • Month 月
      • Day-of-Week 周中的天
      • Year (optional field) 年
  10. TriggerUtils

    • TriggerUtils 提供了许多便捷的方法简化了构造和配置 Trigger
    public static Trigger makeSecondlyTrigger(int intervalInSeconds);
    public static Trigger makeDailyTrigger(int hour, int minute);
    public static Trigger makeWeeklyTrigger(int dayOfWeek, int hour, int minute);
    public static Trigger makeMonthlyTrigger(int dayOfMonth, int hour, int minute);
    public static Date getNextGivenMinuteDate(Date date, int minuteBase);
    public static Date getEvenMinuteDate(Date date);
    

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 在误装Windows server2019 后如何利用Windows.old恢复?
  • Python面试题:如何在 Python 中进行正则表达式操作?
  • C++笔试真题
  • FFmpeg 初级操作—打印日志,文件目录操作
  • 数学基础 -- 函数的连续性
  • 帕金森患者营养小贴士
  • 昇思25天学习打卡营第17天|SSD目标检测
  • Apache AGE 安装部署
  • 如何在 SwiftUI 中开发定制 MapKit 功能
  • 如何在 Windows 10 上恢复未保存的 Word 文档
  • 机器学习——关于极大似然估计法的一些个人思考
  • unity使用 MQTT复现plant simulate仿真
  • Git详解
  • 安防管理平台LntonCVS视频汇聚融合云平台智慧火电厂安全生产管理应用方案
  • 数据模型-ER图在数据模型设计中的应用
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • ECMAScript6(0):ES6简明参考手册
  • ES2017异步函数现已正式可用
  • es6
  • ES6 学习笔记(一)let,const和解构赋值
  • fetch 从初识到应用
  • JAVA_NIO系列——Channel和Buffer详解
  • leetcode98. Validate Binary Search Tree
  • mysql常用命令汇总
  • Next.js之基础概念(二)
  • Puppeteer:浏览器控制器
  • SpingCloudBus整合RabbitMQ
  • 闭包--闭包作用之保存(一)
  • 对超线程几个不同角度的解释
  • 飞驰在Mesos的涡轮引擎上
  • 聚类分析——Kmeans
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 少走弯路,给Java 1~5 年程序员的建议
  • 腾讯优测优分享 | Android碎片化问题小结——关于闪光灯的那些事儿
  • 提醒我喝水chrome插件开发指南
  • 再次简单明了总结flex布局,一看就懂...
  • 阿里云服务器购买完整流程
  • 阿里云服务器如何修改远程端口?
  • 数据库巡检项
  • ​总结MySQL 的一些知识点:MySQL 选择数据库​
  • #中国IT界的第一本漂流日记 传递IT正能量# 【分享得“IT漂友”勋章】
  • $.ajax中的eval及dataType
  • (14)目标检测_SSD训练代码基于pytorch搭建代码
  • (2015)JS ES6 必知的十个 特性
  • (4)事件处理——(7)简单事件(Simple events)
  • (C11) 泛型表达式
  • (Ruby)Ubuntu12.04安装Rails环境
  • (八十八)VFL语言初步 - 实现布局
  • (非本人原创)我们工作到底是为了什么?​——HP大中华区总裁孙振耀退休感言(r4笔记第60天)...
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (六)c52学习之旅-独立按键
  • (亲测成功)在centos7.5上安装kvm,通过VNC远程连接并创建多台ubuntu虚拟机(ubuntu server版本)...
  • (三)Kafka离线安装 - ZooKeeper开机自启
  • (十三)Flink SQL
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)