我是靠谱客的博主 奋斗绿茶,这篇文章主要介绍Quartz---Java定时任务调度工具,现在分享给大家,希望可以做个参考。

  • 一、三个核心概念
  • 调度器(scheduler)
  • 任务(job)
  • 触发器(trigger)
  • 二、主要用到的设计模式
  • Builder模式(创建jobdetail,trigger)
  • Factory模式(创建Scheduler)
  • 组件模式
  • 链式写法
  • 三、重要组成
  • Job
  • JobDetail
  • JobDetail
  • JobStore
  • Trigger:SimpleTrigger、CronTrigger
  • TriggerBuilder:
  • ThreadPool:共享线程池,解决并发问题
  • Scheduler
  • Calendar:一个Trigger可以和多个Calendar关联,以排除或包含某些时间点
  • 监听器:JobListener,TriggerListner,SchedulerListener
  • 四、一张图 ![Quartz体系结构](https://img-blog.csdn.net/20170815185405168?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvSURvZzE0OXRhbw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

  • 五、浅谈Job
  • Job实例在Quartz中的生命周期

    每次调度器执行job时,它在调用execute()方法前会创建1个新的job实例。

    当调用完成后,关联的job对象实例会被释放,释放的实例会被垃圾回收机制回收。
  • JobDetail重要属性:name,group,jobClass,jobDataMap
  • JobExecutionContext:Job通过访问JobExecutionContext对象访问到Quartz运行时候的环境以及Job本身的明细数据
  • JobDataMap:在进行任务调度时,JobDataMap存储在JobExecutionContext中,非常方便获取;JobDataMap可以用来装载任何可序列化的数据对象,当job实例对象被执行时会传递参数给这些对象;JobDataMap实现了JDK的map接口(key-value)。

用法1:在jobDetail或者Trigger里用“usingJobData()”添加键值对数据,在job里用jobDataMap中的getJobDataMap()或者getMergedJodDataMap()获取【若Trigger和JobDetail的key值一致,getMergedJodDataMap()会覆盖掉JobDetail中的值】。举例说明:

复制代码
1
2
3
4
5
6
7
8
9
//添加数据 JobDetail jobDetail=JobBuilder.newJob(HelloJob.class) .withIdentity("myJob","group1") .usingJobData("message", "hello jobDetail1") .usingJobData("message", "hello jobDetail2") .build(); //获取数据 JobDataMap jobDataMap=context.getJobDetail().getJobDataMap(); String msg1=jobDataMap.getString("message");

用法2:直接在Job类中添加setter()方法对应JobDataMap的键值。

  • 六、浅谈Trigger
  • Trigger通用属性:Jobkey/StartTime/EndTime,StartTime和EndTime的值类型是java.util.Date.
  • CronTrigger:基于日历的作业调度。
  • Cron表达式:秒、分钟、小时、日、月、周、天。
    此处应插2张图 ![Cron表达式特殊字符意义对应表]()
    ![通配符说明]()
  • 七、浅谈Scheduler

使用Quartz实现任务:每2秒打印一次“Hello Job”

HelloJob.java

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.text.SimpleDateFormat; import java.util.Date; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class HelloJob implements Job{ public void execute(JobExecutionContext arg0) throws JobExecutionException { // 编写具体的业务逻辑 Date date=new Date(); SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current Exec time is: "+sdf.format(date)); System.out.println("Hello Job!"); } }

HelloScheduler.java

复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.ScheduleBuilder; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.SimpleScheduleBuilder; import org.quartz.Trigger; import org.quartz.TriggerBuilder; import org.quartz.impl.StdSchedulerFactory; public class HelloScheduler { public static void main(String[] args) throws SchedulerException{ //使用builder模式创建1个JobDetail实例,将该实例与HelloJob.class绑定 JobDetail jobDetail=JobBuilder.newJob(HelloJob.class). withIdentity("myJob","group1").build(); //使用builder模式创建1个Trigger实例,定义该job立即执行,并且每隔2秒钟重复执行1次,直到永远 Trigger trigger=TriggerBuilder.newTrigger() .withIdentity("myTrigger", "group1") .startNow().withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(2).repeatForever()) .build(); //创建Scheduler实例,使用factory模式创建 SchedulerFactory sfact=new StdSchedulerFactory(); Scheduler scheduler=sfact.getScheduler(); scheduler.start(); Date date=new Date(); SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); System.out.println("Current time is: "+sdf.format(date)); scheduler.scheduleJob(jobDetail, trigger); } }

最后

以上就是奋斗绿茶最近收集整理的关于Quartz---Java定时任务调度工具的全部内容,更多相关Quartz---Java定时任务调度工具内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(72)

评论列表共有 0 条评论

立即
投稿
返回
顶部