Quartz---JobDataMap和Calender的使用

1.Job类

package com.bobo.quartz.job;

import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;

/**
 * @author bobo
 */
public class HelloJob implements Job {
    @Override
    public void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {
        System.out.println("吴晓波是个大帅哥");
    }
}

2.定时任务

package com.bobo.quartz;

import com.bobo.quartz.job.JobWithData;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;

/**
 */

/**
 * job的工作原理:
 *      在创建JobDetail的时候,将要执行的job的类名传给了JobDetail,所以Scheduler知道要执行什么任务,当定时执行这个任务的时候,
 *      都要创建一个job实例,当执行完成之后,对该实例就丢弃,实例被垃圾回收机制回收。所以必须要有无参构造函数。另外一个在job类中,
 *      不应该定义有状态的数据属性。
 * job增加属性和配置,是使用jobdataMap。这个类是map的一个子类。
 * 如果你在job类中,为JobDataMap中存储的数据的key增加set方法(如在上面示例中,增加setJobSays(String val)方法),
 * 那么Quartz的默认JobFactory实现在job被实例化的时候会自动调用这些set方法,这样你就不需要在execute()方法中显式地从map中取数据了。
 * JobExecutionContext中的JobDataMap为我们提供了很多的便利。它是JobDetail中的JobDataMapTrigger中的JobDataMap的并集,
 * 但是如果存在相同的数据,则后者会覆盖前者的值。
 */

/**
 * 你有Ntrigger需要同时触发,但只有Z个工作线程,优先级最高的Ztrigger会被首先触发。如果没有为trigger设置优先级,trigger使用默认优先级,值为  * 5priority属性的值可以是任意整数,正数、负数都可以。
 *   注意:只有同时触发的trigger之间才会比较优先级。10:59触发的trigger总是在11:00触发的trigger之前执行。
 */

/**
 * 日历示例(calendar)QuartzCalendar对象(不是java.util.Calendar对象)可以在定义和存储trigger的时候与trigger进行关联。Calendar用于从trigger的调度计划中排除时间段。比如,可以创建一个trigger,每个工作日的上午9:30执行,然后增加一个Calendar,排除掉所有的商业节日。
 */
public class QuartzWithData {
    public static void main(String[] args) throws SchedulerException {
        //调度工具
        SchedulerFactory factory=new StdSchedulerFactory();
        //获取调度实例
        Scheduler scheduler=factory.getScheduler();
        //开始一个调度
        scheduler.start();

        //用于定义作业的实例,其中hellojob实现了job这个接口
        JobDetail jobDetail= JobBuilder.newJob(JobWithData.class)
                .usingJobData("Hello","Hello World")
                .withIdentity("myJob","group1")
                .build();
        //触发器,定义执行给定作业的计划的组件
        Trigger trigger=TriggerBuilder.newTrigger()
                .withIdentity("myTrigger","group1")
                .startNow().withSchedule(SimpleScheduleBuilder.simpleSchedule()
                        .withIntervalInSeconds(10).repeatForever())
                .build();
        scheduler.scheduleJob(jobDetail,trigger);
    }
}

3.Calendar的使用

package com.bobo.quartz;

import com.bobo.quartz.job.JobWithData;
import org.quartz.*;
import org.quartz.impl.StdSchedulerFactory;
import org.quartz.impl.calendar.HolidayCalendar;

import java.util.Date;

import static org.quartz.CronScheduleBuilder.dailyAtHourAndMinute;

/**
 */

/**
 * 日历示例(calendar)QuartzCalendar对象(不是java.util.Calendar对象)可以在定义和存储trigger的时候与trigger进行关联。Calendar用于从trigger的调度计划中排除时间段。比如,可以创建一个trigger,每个工作日的上午9:30执行,然后增加一个Calendar,排除掉所有的商业节日。
 * 调度添加假日的参数说明:
 *  calName : 假日的标识。
 *  CalendarCalendar对象
 *  replace:源代码中的解释如下: if there is an internal Scheduler error, or a Calendar with
 *           the same name already exists, and <code>replace</code> is
 *           <code>false</code>.翻译过来的意思是说 如果调度有错误,或者是已经存在了一个同名的Calender。是否需要代替
 *  updateTriggers:源代码中的解释如下:
 *   whether or not to update existing triggers that
 * referenced the already existing calendar so that they are 'correct'
 * based on the new trigger.翻译过来的意思是:是否更新现有的触发器。这个触发器引用了已经存在的日历,以便它们基于新的触发器是正确的。
 */
public class QuartzWithCalendar {

    public static void main(String[] args) throws SchedulerException {
        //调度工具
        SchedulerFactory factory=new StdSchedulerFactory();
        //获取调度实例
        Scheduler scheduler=factory.getScheduler();

        HolidayCalendar holidayCalendar=new HolidayCalendar();
        holidayCalendar.addExcludedDate(new Date());
        scheduler.addCalendar("myholiday",holidayCalendar,false,false);
        //开始一个调度
        scheduler.start();
        JobDetail jobDetail= JobBuilder.newJob(JobWithData.class)
                .usingJobData("Hello","Hello World")
                .withIdentity("myJob","group1")
                .build();

        Trigger trigger = TriggerBuilder.newTrigger()
                .withIdentity("myJob","group1")
                .withSchedule(dailyAtHourAndMinute(9, 30)) // execute job daily at 9:30
                .modifiedByCalendar("myHolidays") // but not on holidays
                .build();

        scheduler.scheduleJob(jobDetail,trigger);
    }
}

猜你喜欢

转载自blog.csdn.net/qq_25484147/article/details/80465692
今日推荐