Quartz---Java定时任务调度工具

来源:互联网 发布:高达00和高达seed知乎 编辑:程序博客网 时间:2024/06/01 09:49
    一、三个核心概念
  • 调度器(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体系结构](http://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中的值】。举例说明:

        //添加数据        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

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

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);    }}
原创粉丝点击