# 示例8 - 日历带来的乐趣

说明

此示例演示如何使用假日日历排除假日作业的执行。

# SimpleJob.java源码

package org.quartz.examples.example8;

import java.util.Date;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;

/**
 * 这只是被例1执行过许多次的简单作业(只改了一下输出信息)
 * 作者:Bill Kratzer
 */
public class SimpleJob implements Job {

    private static Logger _log = LoggerFactory.getLogger(SimpleJob.class);

    /**
     * 作业初始化的空参构造函数
     */
    public SimpleJob() {
    }

    /**
     * 当与此作业相关联的触发器触发时,由调度器调用此方法
     * Throws:作业执行异常(JobExecutionException)-当执行作业时产生异常
     */
    public void execute(JobExecutionContext context)
        throws JobExecutionException {

        //该作业简单地输出它的名称及运行时间
        JobKey jobKey = context.getJobDetail().getKey();
        _log.info("SimpleJob says: " + jobKey + " executing at " + new Date());
    }

}

# CalendarExample.java源码

package org.quartz.examples.example8;

import static org.quartz.DateBuilder.dateOf;
import static org.quartz.JobBuilder.newJob;
import static org.quartz.SimpleScheduleBuilder.simpleSchedule;
import static org.quartz.TriggerBuilder.newTrigger;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerFactory;
import org.quartz.SchedulerMetaData;
import org.quartz.SimpleTrigger;
import org.quartz.examples.example2.SimpleJob;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.AnnualCalendar;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;

/**
 * 本示例将演示如何使用日历排除不应进行日程安排的时间段
 */
public class CalendarExample {

  public void run() throws Exception {
    final Logger log = LoggerFactory.getLogger(CalendarExample.class);

    log.info("------- Initializing ----------------------");

    //首先,我们必须获得对调度器的引用
    SchedulerFactory sf = new StdSchedulerFactory();
    Scheduler sched = sf.getScheduler();

    log.info("------- Initialization Complete -----------");

    log.info("------- Scheduling Jobs -------------------");

    //将假日日历添加到计划中
    AnnualCalendar holidays = new AnnualCalendar();

    //七月四日 
    Calendar fourthOfJuly = new GregorianCalendar(2005, 6, 4);
    holidays.setDayExcluded(fourthOfJuly, true);
    //万圣节(10月31日)
    Calendar halloween = new GregorianCalendar(2005, 9, 31);
    holidays.setDayExcluded(halloween, true);
    //圣诞节(12月25日)
    Calendar christmas = new GregorianCalendar(2005, 11, 25);
    holidays.setDayExcluded(christmas, true);

    //在计划中标注我们的假日日程表
    sched.addCalendar("holidays", holidays, false, false);

    //安排每小时1次的作业,从万圣节上午10点开始
    Date runDate = dateOf(0, 0, 10, 31, 10);

    JobDetail job = newJob(SimpleJob.class).withIdentity("job1", "group1").build();

    SimpleTrigger trigger = newTrigger().withIdentity("trigger1", "group1").startAt(runDate)
        .withSchedule(simpleSchedule().withIntervalInHours(1).repeatForever()).modifiedByCalendar("holidays").build();

    //安排作业并打印第1次运行日期
    Date firstRunTime = sched.scheduleJob(job, trigger);

    //打印出第1个执行日期 
    //注意:由于万圣节(10月31日)是一个假期,所以我们要等到第二天才能执行作业!(11月1日) 
    log.info(job.getKey() + " will run at: " + firstRunTime + " and repeat: " + trigger.getRepeatCount()
             + " times, every " + trigger.getRepeatInterval() / 1000 + " seconds");

    //所有作业都已添加到调度器中,但在调度器启动之前,所有作业都不会执行
    log.info("------- Starting Scheduler ----------------");
    sched.start();

    //等待30秒
    //注意:不会执行任何作业
    log.info("------- Waiting 30 seconds... --------------");
    try {
      //等待30秒以显示作业
      Thread.sleep(30L * 1000L);
      //执行中…
    } catch (Exception e) {
      //
    }

    //关闭调度器
    log.info("------- Shutting Down ---------------------");
    sched.shutdown(true);
    log.info("------- Shutdown Complete -----------------");

    SchedulerMetaData metaData = sched.getMetaData();
    log.info("Executed " + metaData.getNumberOfJobsExecuted() + " jobs.");

  }

  public static void main(String[] args) throws Exception {

    CalendarExample example = new CalendarExample();
    example.run();
  }

}

# 控制台输出

[main] INFO org.quartz.examples.example8.CalendarExample - ------- Initializing ----------------------
[main] INFO org.quartz.impl.StdSchedulerFactory - Using default implementation for ThreadExecutor
[main] INFO org.quartz.simpl.SimpleThreadPool - Job execution threads will use class loader of thread: main
[main] INFO org.quartz.core.SchedulerSignalerImpl - Initialized Scheduler Signaller of type: class org.quartz.core.SchedulerSignalerImpl
[main] INFO org.quartz.core.QuartzScheduler - Quartz Scheduler v.2.3.0 created.
[main] INFO org.quartz.simpl.RAMJobStore - RAMJobStore initialized.
[main] INFO org.quartz.core.QuartzScheduler - Scheduler meta-data: Quartz Scheduler (v2.3.0) 'DefaultQuartzScheduler' with instanceId 'NON_CLUSTERED'
  Scheduler class: 'org.quartz.core.QuartzScheduler' - running locally.
  NOT STARTED.
  Currently in standby mode.
  Number of jobs executed: 0
  Using thread pool 'org.quartz.simpl.SimpleThreadPool' - with 10 threads.
  Using job-store 'org.quartz.simpl.RAMJobStore' - which does not support persistence. and is not clustered.

[main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler 'DefaultQuartzScheduler' initialized from default resource file in Quartz package: 'quartz.properties'
[main] INFO org.quartz.impl.StdSchedulerFactory - Quartz scheduler version: 2.3.0
[main] INFO org.quartz.examples.example8.CalendarExample - ------- Initialization Complete -----------
[main] INFO org.quartz.examples.example8.CalendarExample - ------- Scheduling Jobs -------------------
[main] INFO org.quartz.examples.example8.CalendarExample - group1.job1 will run at: Tue Nov 01 00:00:10 CST 2022 and repeat: -1 times, every 3600 seconds
[main] INFO org.quartz.examples.example8.CalendarExample - ------- Starting Scheduler ----------------
[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED started.
[main] INFO org.quartz.examples.example8.CalendarExample - ------- Waiting 30 seconds... --------------
[main] INFO org.quartz.examples.example8.CalendarExample - ------- Shutting Down ---------------------
[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutting down.
[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED paused.
[main] INFO org.quartz.core.QuartzScheduler - Scheduler DefaultQuartzScheduler_$_NON_CLUSTERED shutdown complete.
[main] INFO org.quartz.examples.example8.CalendarExample - ------- Shutdown Complete -----------------
[main] INFO org.quartz.examples.example8.CalendarExample - Executed 0 jobs.

Process finished with exit code 0

微信公众号

QQ交流群
原创网站开发,偏差难以避免。

如若发现错误,诚心感谢反馈。

愿你倾心相念,愿你学有所成。

愿你朝华相顾,愿你前程似锦。