百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

开源定时任务框架Quartz(机构没有参与制定碳减排的框架路线图)

ccwgpt 2024-09-18 12:26 38 浏览 0 评论

Job和JobDetail

Job是Quartz中的一个接口,接口下只有execute方法,在这个方法中编写业务逻辑。

该接口的源码:


  1. package org.quartz;
  2. public interface Job {
  3. void execute(JobExecutionContext var1) throws JobExecutionException;
  4. }

每次调度执行Job时,调用execute方法前会创建一个新的Job实例,执行完后,关联的Job对象实例会被释放,随后jvm执行GC。

JobDetail是用来绑定Job,为Job实例提供了许多属性,以及JobDataMap成员变量属性。调度器scheduler通过JobDetail对象来添加Job实例。

属性:

1. name

2. group

3. jobClass

4. jobDataMap

JobExecutionContext

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

代码演示:


  1. public class HelloWorldJob implements Job {
  2. @Override
  3. public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
  4. String strTime = new SimpleDateFormat("HH-mm-ss").format(new Date());
  5. System.out.println( strTime + ":Hello World!");
  6. System.out.println("JobDetail'name:" + jobExecutionContext.getJobDetail().getKey().getName());
  7. System.out.println("JobDetail'group:" + jobExecutionContext.getJobDetail().getKey().getGroup());
  8. System.out.println("JobDetail'class:" + jobExecutionContext.getJobDetail().getClass());
  9. }
  10. }

JobDataMap

任务调度时可以通过JobExecutionContext获取JobDataMap,可以装在任何可序列化的数据对象,JobDataMap实现了JDK的Map接口,可以以Key-Value的形式存储数据。

实战:JobDetail和Trigger传递数据,HelloWorldJob类execute三种方式获取数据。


  1. //创建JobDetail实例,并与HelloWordlJob类绑定
  2. JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "jobGroup1")
  3. .usingJobData("key1","this is jobDetail")
  4. .build();
  5. //创建触发器Trigger实例(立即执行,每隔1S执行一次)
  6. Trigger trigger = TriggerBuilder.newTrigger()
  7. .withIdentity("trigger1", "triggerGroup1")
  8. .usingJobData("key2", "this is trigger")
  9. .startNow()
  10. .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
  11. .build();

HelloWorldJob获取数据:


  1. public class HelloWorldJob implements Job {
  2. private String key1;
  3. private String key2;
  4. public String getKey1() {
  5. return key1;
  6. }
  7. public void setKey1(String key1) {
  8. this.key1 = key1;
  9. }
  10. public String getKey2() {
  11. return key2;
  12. }
  13. public void setKey2(String key2) {
  14. this.key2 = key2;
  15. }
  16. @Override
  17. public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
  18. String strTime = new SimpleDateFormat("HH-mm-ss").format(new Date());
  19. System.out.println( strTime + ":Hello World!");
  20. //获取DataMap数据方法一
  21. System.out.println("JobDetail JobDataMap:" + jobExecutionContext.getJobDetail().getJobDataMap().get("key1"));
  22. System.out.println("Trigger JobDataMap:" + jobExecutionContext.getTrigger().getJobDataMap().get("key2"));
  23. //获取DataMap数据方法二
  24. System.out.println("JobDataMap:" + jobExecutionContext.getMergedJobDataMap().get("key1"));
  25. System.out.println("JobDataMap:" + jobExecutionContext.getMergedJobDataMap().get("key2"));
  26. //获取数据方法三
  27. System.out.println("通过成员变量获取" + key1);
  28. System.out.println("通过成员变量获取" + key2);
  29. }
  30. }

Trigger

Trigger是Quartz中的触发器,任务执行时会通知调度器Scheduler何时出发,几个重要的属性。

1. Jobkey:表示job实例的标识

2. StartTime:表示触发器首次被触发的时间(Java.util.Date)。

3. EndTime:表示触发器结束触发的时间(Java.util.Date)

实战:实现5S后执行,10S后结束,期间每隔1S执行一次定时任务

代码演示:

MyScheduler类


  1. public class MyScheduler {
  2. public static void main(String[] args) throws SchedulerException {
  3. //创建调度器Schedule
  4. SchedulerFactory schedulerFactory = new StdSchedulerFactory();
  5. Scheduler scheduler = schedulerFactory.getScheduler();
  6. //创建JobDetail实例,并与HelloWordlJob类绑定
  7. JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "jobGroup1")
  8. .build();
  9. //创建触发器Trigger实例(5S后执行,10S后结束)
  10. //开始时间(5S后)
  11. Date date1 = new Date();
  12. date1.setTime(date1.getTime() + 5000);
  13. //结束时间(10S后)
  14. Date date2 = new Date();
  15. date2.setTime(date2.getTime() + 10000);
  16. Trigger trigger = TriggerBuilder.newTrigger()
  17. .withIdentity("trigger1", "triggerGroup1")
  18. .startAt(date1)
  19. .endAt(date2)
  20. .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1).repeatForever())
  21. .build();
  22. //开始执行
  23. scheduler.scheduleJob(jobDetail, trigger);
  24. scheduler.start();
  25. }
  26. }

SimpleTrigger

SimpleTrigger可以实现在一个指定时间段内执行一次作业任务或一个时间段内多次执行作业任务。

实战:5S后开始执行,间隔时间为1S,第一次执行后连续执行3次


  1. package quartz2;
  2. import org.quartz.*;
  3. import org.quartz.impl.StdSchedulerFactory;
  4. import java.util.Date;
  5. /**
  6. * created by Java-Road
  7. * created in 2018/5/27
  8. */
  9. public class MyScheduler2 {
  10. public static void main(String[] args) throws SchedulerException {
  11. //创建调度器Schedule
  12. SchedulerFactory schedulerFactory = new StdSchedulerFactory();
  13. Scheduler scheduler = schedulerFactory.getScheduler();
  14. //创建JobDetail实例,并与HelloWordlJob类绑定
  15. JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "jobGroup1")
  16. .build();
  17. //创建触发器Trigger实例(5S后执行,一直执行)
  18. //开始时间(5S后)
  19. Date date1 = new Date();
  20. date1.setTime(date1.getTime() + 5000);
  21. SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
  22. .withIdentity("trigger1", "triggerGroup1")
  23. .startAt(date1)
  24. .withSchedule(SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(1)
  25. .withRepeatCount(3))
  26. .build();
  27. //开始执行
  28. scheduler.scheduleJob(jobDetail, trigger);
  29. scheduler.start();
  30. }
  31. }

CronTrigger

CronTrigger功能非常强大,是基于日历的作业调度,而SimpleTrigger是精准指定间隔,所以相比SimpleTrigger,CroTrigger更加常用。CroTrigger是基于Cron表达式的,先了解下Cron表达式:

由7个子表达式组成字符串的,格式如下:

[秒] [分] [小时] [日] [月] [周] [年]

Cron表达式的语法就不多说了,因为我也记不住只能度娘,给大家提供个在线生成Cron表达式的工具:http://cron.qqe2.com/

实战:实现每周一到周五上午10:30执行定时任务


  1. package quartz2;
  2. import org.quartz.*;
  3. import org.quartz.impl.StdSchedulerFactory;
  4. import java.util.Date;
  5. /**
  6. * created by Java-Road
  7. * created in 2018/5/27
  8. */
  9. public class MyScheduler3 {
  10. public static void main(String[] args) throws SchedulerException {
  11. //创建调度器Schedule
  12. SchedulerFactory schedulerFactory = new StdSchedulerFactory();
  13. Scheduler scheduler = schedulerFactory.getScheduler();
  14. //创建JobDetail实例,并与HelloWordlJob类绑定
  15. JobDetail jobDetail = JobBuilder.newJob(HelloWorldJob.class).withIdentity("job1", "jobGroup1")
  16. .build();
  17. //创建触发器CronTrigger实例(每周一到周五10:30执行任务)
  18. CronTrigger trigger = (CronTrigger) TriggerBuilder.newTrigger()
  19. .withIdentity("trigger1", "triggerGroup1")
  20. .startNow()
  21. .withSchedule(CronScheduleBuilder.cronSchedule("* 30 10 ? * MON-FRI *"))
  22. .build();
  23. //开始执行
  24. scheduler.scheduleJob(jobDetail, trigger);
  25. scheduler.start();
  26. }
  27. }

相关推荐

公司组织架构及部门职责#管理制度 #薪酬绩效 #组织架构

...

终于把“公司组织架构与管理部岗位配置”整理好了,拿来即用!

...

老板看完这份“公司组织架构详解”就解放了!

...

丨公司丨公司大架构整理汇总

注:本文转自团队成员原创作品,特此鸣谢(公号:法海图鉴)今日话题公司大架构整理背景介绍经过前几期话题对各种企业类型的介绍,想必大家已经有了初步认识。之后我将带着大家开启对公司的深入了解。本期...

图解物理--八年级物理下册最全知识框架导图

第七章力1力2弹力3重力第八章运动和力1牛顿第一定律2二力平衡3摩擦力第九章压强1压强2液体压强3大气压强4流体压强与流速的关系第十章浮力1浮力2阿基米德原理3物体的浮沉条件及应用第十一章功...

八年级上册生物,思维导图,期末高分必备资料,家长收藏

这是八年级上册生物的思维导图,孩子在背诵知识点的时候,可以看一下知识点在导图中的位置,形成对知识点整体的把握,有助于学生拿高分,特别是图片中带红色星星的部分,更是要注意背诵,是重点内容。家长可以把图片...

2019政府工作报告精华,这张思维导图里全都有

每经记者:李可愚每经编辑:陈星每日经济新闻

图解薪酬体系结构设计

...

司考复习独家总结!一张图总结行政法知识结构体系

作为三大实体法之一,行政法的分值在60分左右,行政法在司法考试中一直比较平稳常规,没有偏题怪题,还是比较容易得分的。小编要提醒大家,在3月之前要把三大实体法学习一遍。下图是厚大在线360导学师小周总结...

一图读懂香港国安新架构:各职位人选公布 有官员曾强硬喊话乱港分子

实用干货!高中物理框架图,让零碎知识“串联”起来

高中物理学习一定要抓好逻辑结构大框架!了解整个知识框架体系后,更易抓住骨干知识,干掉重难知识点~今天给大家分享高中物理的框架图同学们赶紧收藏起来吧!力学知识结构图光学知识结构图热学、原子物理知识结构图...

254m超高层办公楼型钢砼框架-核心筒结构图

高度类别:超高层建筑钢筋混凝土结构:框架,框架核心筒钢结构:钢框架建筑功能:办公包含:办公楼57层(-3层)254.150m钻孔灌注桩桩+筏板型钢混凝土框架-钢筋混凝土核心筒西裙房2层(-...

砖混结构与框架结构,究竟有何区别?千万别被坑!

现在买房装修的人最怕啥?不是价格高,而是房子不安全!两种主流建筑结构,砖混靠墙,框架靠柱子,选错了隔墙都可能要命。简单说,砖混便宜但别碰高层,框架贵点但能保命。砖混那些承重墙根本不能拆,想砸墙改个开放...

大师一百——高中化学必考:《元素周期律》考点框架图

今天大师给大家带来的是高中化学的《元素周期律》考点框架图,高中的同学必须牢记于心,这种重要的考点,考试是一定会考的!化学大师...

需求分析框架图

需求分析框架图

取消回复欢迎 发表评论: