最牛逼的任务调度工具 | Quartz 任务调度worker
yuyutoo 2024-11-01 15:55 2 浏览 0 评论
Quartz 是一个完全由 Java 编写的开源作业调度框架,不要让作业调度这个术语吓着你,其实不难。尽管 Quartz 框架整合了许多额外功能,但就我们使用来说,你会发现它易用得简直让人受不了!
简单来说,任务调度就是在指定时间做指定的事,之前说过在执行定时定频率作业时可以使用原生 JDK,Timer 和 TimerTask 。
但是假如我们有一些非常苛刻的要求该怎么办呢?比如,在每年 5 月的第二个星期日和每年 6 月的第三个星期日给我发一个邮件。
这种看似随机但还有有一点规律的定时任务该怎么实现呢?别急,Quartz 都能给你搞定!
我们执行任务必须的几个条件,一个是调度器,二是执行的任务,三是触发器(可以理解为设置闹钟)。连在一起就是我们使用调度器将任务和触发器绑定在一起执行,以达到在指定的时间点执行或循环执行任务。
虽说 Quartz 框架有十多个包,300 多个类,但是我们使用它还是比较容易的。
首先,创建一个任务,一样的套路我们只需要实现 Job 类,实现特定的方法即可,任务创建成功。
public class HelloJob implements Job{
@Override
public void execute(JobExecutionContext context) throws JobExecutionException {
TimeUtil.printCurrentTime();
System.out.println("Hello world!");
}
}
但是我们调度器绑定的不是 Job 的实现类 HelloJob,而是一个 JobDetail,为什么需要它呢,都写在脸上了,Job 详情嘛!
我们执行任务需要知道任务的名称啊,分组之类的,这样打出来的 log 也好分辨。这个 JobDetail 是和哪个 Job 绑定的呢?我们还要知道 Class 信息。在任务执行的时候可能还需要传参,这些都会封装在 JobDetail 中。
JobDetail 的创建就更是巧妙了,Quartz 为任务和触发器的创建提供了一种构建器风格的 API。具体的创建就是这样(一路点下去)
JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group1").build();
呃呃,构建器风格…… 我也不是很懂,感觉用起来很方便就对了,这样我们就创建了一个 JobDetail ,并设置了绑定的 Job (HelloJob),还为任务命名并分组,其实还可以继续绑定参数。这里没有演示而已。
同样的创建风格也用在触发器身上,想想看我们要设置一个闹钟,我们要设置开始执行的时间,执行的频率,执行的次数,这些一次性搞定,若是你英文还可以,看这些方法应该都明白了。
Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group").startNow()
.withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(2).repeatForever()).build();
哎,不是说好了不按套路出牌的嘛,我要的是每年 5 月的第二个星期日执行呀,可不是定时定频率啊,别急,后面说。
最后,再创建一个调度器,使用工厂模式创建,这里选择 StdSchedulerFactory ,因为这个工厂是可以加载配置文件的。在框架中会默认给我们提供一套配置,我们也可以在项目根目录下自行创建。
调度器的创建、绑定任务和触发器到执行,几行代码搞定。
// 定义一个 Schedule,用于绑定任务和触发器
SchedulerFactory sf = new StdSchedulerFactory();
Scheduler scheduler = sf.getScheduler();
scheduler.scheduleJob(jobDetail, trigger);
scheduler.start();
好了,这里为此,我们就已经搞定了最牛逼的定时任务的 demo 了。但是,你有没有发现,若是想实现定时定频率的执行任务,使用 Timer 就可以啊,为什么要劳烦大哥出场呢?
这里提一下 Timer 和 Quartz 的区别吧。
1、Timer 只能执行定时定频率的任务,而 Quartz 不是。
2、Timer 只有一个线程在执行,而 Quartz 有线程池,默认开启 10 个线程。
3、Timer 中出现异常,一切 GG,不能记录事故现场,而 Quartz 可以。
Quartz 想灵活的设置执行时间,依赖谁呢?调度器?NO,那肯定是触发器啊,其实 Trigger 有两个实现类,一个是 SimpleTrigger 就是功能比较简单的那个,默认实现的就是这个,所以上面我们返回就是 SimpleTrigger 的对象。
而另一个重磅级的实现类就是 CronTrigger ,它的触发机制是基于日历的,所以,你能想到的每一天,都能给你表示出来,触发器,重点就在这个时间的表示上面,我们使用 Cron 表达式来表示执行的时间。
举个例子吧 "* * * * * ? *" 表示每秒钟都执行,"0 15 10 ? 6L 2018-2020" 表示 2018-2020 年的每个月的最后一个星期五上午 10:15 执行。你会想,WTF ? 这是什么鬼,我不打算细说这个 Cron 表达式怎么写,因为不需要自己写!简单说,这就类似与正则表达式,而我们可以用在线生成工具来生成他们。
你只需要搜索 Cron 表达式在线生成器即可。
有了随心所欲的时间之后,我们就可以使用 CronTrigger 来定义触发器了,核心就在 Cron 表达式上面。
CronTrigger cronTrigger = (CronTrigger)TriggerBuilder.newTrigger().withIdentity("trigger1", "group").startNow()
.withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ? *")).build();
至于多线程和持久化相关的类都在调度器中,不得不说 Quartz 封装的就是好呀,使用者根本感觉不到这些,在 StdSchedulerFactory 的内部,封装了核心调度器 QuartzScheduler ,用于持久化任务的 JobStore ,多线程相关的线程池、线程执行器。
但是我这种没有具体业务需求的人是不会深入研究的,对了,不要忘了 Quartz 的可配置的特性,简直就是逆天,没有业务场景应用的我也就想想得了。
以上也就是带你了解一下 Quartz,自己玩玩完全没问题。但是,你要是还不知道 Timer ,那就是你的问题了。
相关推荐
- jQuery VS AngularJS 你更钟爱哪个?
-
在这一次的Web开发教程中,我会尽力解答有关于jQuery和AngularJS的两个非常常见的问题,即jQuery和AngularJS之间的区别是什么?也就是说jQueryVSAngularJS?...
- Jquery实时校验,指定长度的「负小数」,小数位未满末尾补0
-
在可以输入【负小数】的输入框获取到焦点时,移除千位分隔符,在输入数据时,实时校验输入内容是否正确,失去焦点后,添加千位分隔符格式化数字。同时小数位未满时末尾补0。HTML代码...
- 如何在pbootCMS前台调用自定义表单?pbootCMS自定义调用代码示例
-
要在pbootCMS前台调用自定义表单,您需要在后台创建表单并为其添加字段,然后在前台模板文件中添加相关代码,如提交按钮和表单验证代码。您还可以自定义表单数据的存储位置、添加文件上传字段、日期选择器、...
- 编程技巧:Jquery实时验证,指定长度的「负小数」
-
为了保障【负小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【负小数】的方法。HTML代码<inputtype="text"class="forc...
- 一篇文章带你用jquery mobile设计颜色拾取器
-
【一、项目背景】现实生活中,我们经常会遇到配色的问题,这个时候去百度一下RGB表。而RGB表只提供相对于的颜色的RGB值而没有可以验证的模块。我们可以通过jquerymobile去设计颜色的拾取器...
- 编程技巧:Jquery实时验证,指定长度的「正小数」
-
为了保障【正小数】的正确性,做成了通过Jquery,在用户端,实时验证指定长度的【正小数】的方法。HTML做成方法<inputtype="text"class="fo...
- jquery.validate检查数组全部验证
-
问题:html中有多个name[],每个参数都要进行验证是否为空,这个时候直接用required:true话,不能全部验证,只要这个数组中有一个有值就可以通过的。解决方法使用addmethod...
- Vue进阶(幺叁肆):npm查看包版本信息
-
第一种方式npmviewjqueryversions这种方式可以查看npm服务器上所有的...
- layui中使用lay-verify进行条件校验
-
一、layui的校验很简单,主要有以下步骤:1.在form表单内加上class="layui-form"2.在提交按钮上加上lay-submit3.在想要校验的标签,加上lay-...
- jQuery是什么?如何使用? jquery是什么功能组件
-
jQuery于2006年1月由JohnResig在BarCampNYC首次发布。它目前由TimmyWilson领导,并由一组开发人员维护。jQuery是一个JavaScript库,它简化了客户...
- django框架的表单form的理解和用法-9
-
表单呈现...
- jquery对上传文件的检测判断 jquery实现文件上传
-
总体思路:在前端使用jquery对上传文件做部分初步的判断,验证通过的文件利用ajaxFileUpload上传到服务器端,并将文件的存储路径保存到数据库。<asp:FileUploadI...
- Nodejs之MEAN栈开发(四)-- form验证及图片上传
-
这一节增加推荐图书的提交和删除功能,来学习node的form提交以及node的图片上传功能。开始之前需要源码同学可以先在git上fork:https://github.com/stoneniqiu/R...
- 大数据开发基础之JAVA jquery 大数据java实战
-
上一篇我们讲解了JAVAscript的基础知识、特点及基本语法以及组成及基本用途,本期就给大家带来了JAVAweb的第二个知识点jquery,大数据开发基础之JAVAjquery,这是本篇文章的主要...
- 推荐四个开源的jQuery可视化表单设计器
-
jquery开源在线表单拖拉设计器formBuilder(推荐)jQueryformBuilder是一个开源的WEB在线html表单设计器,开发人员可以通过拖拉实现一个可视化的表单。支持表单常用控件...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)