领悟Quartz(1)

Quartz的基础认识

最近生产的自动任务总是时不时挂掉,弄得每天需要早早去公司手动跑批。心力憔悴,劳动节后痛定思痛,决定从根本上解决这个问题。(公司所用quartz版本1.6)

认识quartz

Quartz is a richly featured, open source job scheduling library that can be integrated within virtually any Java application.
quartz是一个贼屌的开源作业调度库,可用于几乎所有的java程序。

基础认识

Quartz有3个基础接口,分别为:

  1. Scheduler:调度器接口
  2. Job:作业接口
  3. Trigger:触发器接口
    我知道此时你一头雾水,没关系,慢慢来:首先我们来看一下一个完整的触发过程:
 try {
    SchedulerFactory schedFact = new StdSchedulerFactory();
    Scheduler sched = schedFact.getScheduler();
    sched.start();
    JobDetail jobDetail = new JobDetail("QuartzTestJob",
            "1", QuartzTest.class);
    jobDetail.getJobDataMap().put("chat", "hhh");
    CronTrigger trigger = new CronTrigger("QuartzTestJob",
            "1");
    trigger.setCronExpression("0/1 * * ? * * *");
    sched.scheduleJob(jobDetail, trigger);
} catch (Exception e) {
    e.printStackTrace();
}

Scheduler:调度器接口

调度器是Quartz框架的核心,管理着所有Trigger和Job,使得触发器能够成功触发作业运行。调度器接口本身有两个实现类:StdScheduler和RemoteScheduler。一般而言,都是使用StdScheduler,即标准调度器。StdScheduler调度器的构造函数需要两个参数,分别为QuartzScheduler对象和SchedulingContext 对象。往往我们会使用工厂来创建调度器。而说起工厂模式,scheduler有DirectSchedulerFactory和StdSchedulerFactory两种工厂模式。正常情况下都是使用StdSchedulerFactory工厂。
以上内容可以先不懂,日后再纠结。

Job:作业接口

事实上,当你打开org.quartz包中的Job.class你会发现,它只有一个名为void execute(JobExecutionContext context) throws JobExecutionException的接口。这个接口的实现就是我们要触发的作业部分。
参照上述代码,有这么一句话JobDetail jobDetail = new JobDetail("QuartzTestJob", "1", QuartzTest.class);,这句话中的QuartzTest.class其实就是实现Job接口的类,其实现函数如下:

public void execute(JobExecutionContext context) throws JobExecutionException {
      System.out.println(context.getJobDetail().getJobDataMap().get("chat"));
  }

Trigger:触发器接口

其位于包org.quartz的Trigger.class类,它拥有两个子类分别为SimpleTrigger以及CronTrigger。
这两个类作业和名字一样,一个是简单触发器接口一个是cron表达式触发器。
首先是简单触发器,我们打开SimpleTrigger.class,找到参数最全的构造函数,不难发现,其实这几个参数就是名字、分组、开始时间、结束时间、重复次数以及重复的间隔。

public SimpleTrigger(String name, String group, String jobName,
        String jobGroup, Date startTime, Date endTime, int repeatCount,
        long repeatInterval) {
    super(name, group, jobName, jobGroup);
    setStartTime(startTime);
    setEndTime(endTime);
    setRepeatCount(repeatCount);
    setRepeatInterval(repeatInterval);
}

其次Cron触发器其实和上面的类似,其参数最全的构造函数为:

    public CronTrigger(String name, String group, String jobName,
            String jobGroup, Date startTime, Date endTime,
            String cronExpression, TimeZone timeZone) throws ParseException {
        super(name, group, jobName, jobGroup);
        setCronExpression(cronExpression);
        if (startTime == null) {
            startTime = new Date();
        }
        setStartTime(startTime);
        if (endTime != null) {
            setEndTime(endTime);
        }
        if (timeZone == null) {
            setTimeZone(TimeZone.getDefault());
        } else {
            setTimeZone(timeZone);
        }
    }

Cron触发器中,有两个参数值得我们特殊注意,一个是timeZone,另一个是cronExpression。其实无非就是将简单的时间出发改为了cronExpression表达式。而timeZone则是系统默认时间而已。我们一开始的例子其实用的就是CronTrigger。

简单小结

我们可以看到,所谓自动任务,其实就是配置触发器,配置任务,最后将任务与触发器相关联而已。

原创文章 8 获赞 16 访问量 1659

猜你喜欢

转载自blog.csdn.net/weixin_44159662/article/details/105944834
今日推荐