quartz 2.2.3 自带示例源码解读example1~example5

Example1 第一个quartz示例

public class HelloJob implements Job {
	
	private static Logger _log = LoggerFactory.getLogger(HelloJob.class);

	public HelloJob() {
	}
	
	@Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		_log.info("Hello World! - " + new Date());
	}
}


public class SimpleExample {
	public void run() throws Exception {
		Logger log = LoggerFactory.getLogger(SimpleExample.class);
		
		log.info("------- Initializing ----------------------");
		
		SchedulerFactory sf = new StdSchedulerFactory();
		Scheduler sched = sf.getScheduler();
		
		log.info("------- Initialization Complete -----------");
		
		// 下一个整分钟
		Date runTime = DateBuilder.evenMinuteDate(new Date());
		
		log.info("------- Scheduling Job  -------------------");
		
		JobDetail job = JobBuilder.newJob(HelloJob.class).withIdentity("job1", "group").build();
		Trigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1").startAt(runTime).build();
		sched.scheduleJob(job, trigger);
		
		log.info(job.getKey() + " will run at: " + runTime);
		
		sched.start();
		
		log.info("------- Started Scheduler -----------------");
		log.info("------- Waiting 65 seconds... -------------");
		
		try {
			Thread.sleep(65L * 1000L);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}
		
		log.info("------- Shutting Down ---------------------");
		sched.shutdown(true);
		log.info("------- Shutdown Complete -----------------");
	}
	
	public static void main(String[] args) throws Exception {
		SimpleExample example = new SimpleExample();
		example.run();
	}
}


Example2 简单触发器

public class SimpleJob implements Job {
	private static Logger _log = LoggerFactory.getLogger(SimpleJob.class);

	public SimpleJob() {
	}
	
	@Override
	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		JobKey jobKey = context.getJobDetail().getKey();
		_log.info("SimpleJob says: " + jobKey + " executing at " + new Date());
	}
}


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

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

		// 得到调度器实例的引用
		SchedulerFactory sf = new StdSchedulerFactory();
		Scheduler sched = sf.getScheduler();

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

		// jobs can be scheduled before sched.start() has been called

		// 任务开始时间的秒数是15的倍数
		Date startTime = DateBuilder.nextGivenSecondDate(null, 15);

		// job1开始时间的秒数是15的倍数
		JobDetail job = JobBuilder.newJob(SimpleJob.class).withIdentity("job1", "group1").build();
		SimpleTrigger trigger = (SimpleTrigger) TriggerBuilder.newTrigger()
				.withIdentity("trigger1", "group1").startAt(startTime).build();
		// 调度任务
		Date ft = sched.scheduleJob(job, trigger);
		log.info(job.getKey() + " will run at: " + ft + " and repeat: "
				+ trigger.getRepeatCount() + " times, every "
				+ trigger.getRepeatInterval() / 1000 + " seconds");

		// job2开始时间的秒数是15的倍数
		job = JobBuilder.newJob(SimpleJob.class).withIdentity("job2", "group1").build();
		trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity(
				"trigger2", "group1").startAt(startTime).build();
		ft = sched.scheduleJob(job, trigger);
		log.info(job.getKey() + " will run at: " + ft + " and repeat: "
				+ trigger.getRepeatCount() + " times, every "
				+ trigger.getRepeatInterval() / 1000 + " seconds");

		// job3开始时间的秒数是15的倍数(运行一次,重复10次,共11次,每次运行间隔为10s)
		job = JobBuilder.newJob(SimpleJob.class).withIdentity("job3", "group1").build();
		trigger = TriggerBuilder.newTrigger()
				.withIdentity("trigger3", "group1").startAt(startTime)
				.withSchedule(
						SimpleScheduleBuilder.simpleSchedule()
								.withIntervalInSeconds(10).withRepeatCount(10))
				.build();
		ft = sched.scheduleJob(job, trigger);
		log.info(job.getKey() + " will run at: " + ft + " and repeat: "
				+ trigger.getRepeatCount() + " times, every "
				+ trigger.getRepeatInterval() / 1000 + " seconds");

		
		// 相同的job3开始时间的秒数是15的倍数(运行一次,重复2次,共3次,每次运行间隔为10s)
		trigger = TriggerBuilder.newTrigger()
				.withIdentity("trigger3", "group2").startAt(startTime)
				.withSchedule(
						SimpleScheduleBuilder.simpleSchedule()
								.withIntervalInSeconds(10).withRepeatCount(2))
				.forJob(job).build();
		ft = sched.scheduleJob(trigger);
		log.info(job.getKey() + " will [also] run at: " + ft + " and repeat: "
				+ trigger.getRepeatCount() + " times, every "
				+ trigger.getRepeatInterval() / 1000 + " seconds");

		// job4开始时间的秒数是15的倍数(运行一次,重复5次,共6次,每次运行间隔为10s)
		job = JobBuilder.newJob(SimpleJob.class).withIdentity("job4", "group1").build();
		trigger = TriggerBuilder.newTrigger().withIdentity("trigger4", "group1").startAt(
				startTime).withSchedule(
						SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(10).withRepeatCount(5))
				.build();
		ft = sched.scheduleJob(job, trigger);
		log.info(job.getKey() + " will run at: " + ft + " and repeat: "
				+ trigger.getRepeatCount() + " times, every "
				+ trigger.getRepeatInterval() / 1000 + " seconds");

		// job5会立即调度,运行时间在5分钟后
		job = JobBuilder.newJob(SimpleJob.class).withIdentity("job5", "group1").build();
		trigger = (SimpleTrigger) TriggerBuilder.newTrigger().withIdentity("trigger5",
				"group1").startAt(DateBuilder.futureDate(5, IntervalUnit.MINUTE)).build();
		ft = sched.scheduleJob(job, trigger);
		log.info(job.getKey() + " will run at: " + ft + " and repeat: "
				+ trigger.getRepeatCount() + " times, every "
				+ trigger.getRepeatInterval() / 1000 + " seconds");

		// job6开始时间的秒数是15的倍数,并且每40秒会重复运行一次,无限重复
		job = JobBuilder.newJob(SimpleJob.class).withIdentity("job6", "group1").build();
		trigger = TriggerBuilder.newTrigger().withIdentity("trigger6", "group1").startAt(
				startTime).withSchedule(
						SimpleScheduleBuilder.simpleSchedule().withIntervalInSeconds(40).repeatForever())
				.build();
		ft = sched.scheduleJob(job, trigger);
		log.info(job.getKey() + " will run at: " + ft + " and repeat: "
				+ trigger.getRepeatCount() + " times, every "
				+ trigger.getRepeatInterval() / 1000 + " seconds");

		log.info("------- Starting Scheduler ----------------");

		// 所有的任务已加入调度器,但调度器未开始之前所有的任务都不会运行
		sched.start();
		log.info("------- Started Scheduler -----------------");
		// 调度器运行后任务仍然可以被调度
		
		// job7开始时间的秒数是15的倍数,并且每5分钟会重复运行一次,重复20次
		job = JobBuilder.newJob(SimpleJob.class).withIdentity("job7", "group1").build();
		trigger = TriggerBuilder.newTrigger().withIdentity("trigger7", "group1").startAt(
				startTime).withSchedule(
						SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(5).withRepeatCount(20))
				.build();
		ft = sched.scheduleJob(job, trigger);
		log.info(job.getKey() + " will run at: " + ft + " and repeat: "
				+ trigger.getRepeatCount() + " times, every "
				+ trigger.getRepeatInterval() / 1000 + " seconds");

		// job8可以直接运行,而不使用触发器
		job = JobBuilder.newJob(SimpleJob.class).withIdentity("job8", "group1")
				.storeDurably().build();
		sched.addJob(job, true);
		log.info("'Manually' triggering job8...");
		sched.triggerJob(JobKey.jobKey("job8", "group1"));

		log.info("------- Waiting 30 seconds... --------------");

		try {
			Thread.sleep(30L * 1000L);
		} catch (Exception e) {
			e.printStackTrace();
		}

		// job7可以重复调度,开始时间的秒数是15的倍数,并且每5分钟会重复运行一次,重复20次
		log.info("------- Rescheduling... --------------------");
		trigger = TriggerBuilder.newTrigger().withIdentity("trigger7", "group1").startAt(
				startTime).withSchedule(
						SimpleScheduleBuilder.simpleSchedule().withIntervalInMinutes(5).withRepeatCount(20))
				.build();

		ft = sched.rescheduleJob(trigger.getKey(), trigger);
		log.info("job7 rescheduled to run at: " + ft);

		log.info("------- Waiting five minutes... ------------");
		try {
			// 等待5分钟
			Thread.sleep(300L * 1000L);
		} catch (Exception e) {
			e.printStackTrace();
		}

		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 {
		SimpleTriggerExample example = new SimpleTriggerExample();
		example.run();
	}
}

Example 3 crontab格式的触发器

public class SimpleJob implements Job {

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

	public SimpleJob() {
	}

	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		// 打印job的名称和运行时间
		JobKey jobKey = context.getJobDetail().getKey();
		_log.info("SimpleJob says: " + jobKey + " executing at " + new Date());
	}
}


public class CronTriggerExample {

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

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

    // 得到调度器的引用
    SchedulerFactory sf = new StdSchedulerFactory();
    Scheduler sched = sf.getScheduler();

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

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

    // job可以在调度器运行前被调度

    // job 1 每20秒运行1次
    JobDetail job = newJob(SimpleJob.class).withIdentity("job1", "group1").build();
    CronTrigger trigger = newTrigger().withIdentity("trigger1", "group1").withSchedule(cronSchedule("0/20 * * * * ?"))
        .build();
    Date ft = sched.scheduleJob(job, trigger);
    log.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: "
             + trigger.getCronExpression());

    // job 2 在偶数分钟的第15秒运行
    job = newJob(SimpleJob.class).withIdentity("job2", "group1").build();
    trigger = newTrigger().withIdentity("trigger2", "group1").withSchedule(cronSchedule("15 0/2 * * * ?")).build();
    ft = sched.scheduleJob(job, trigger);
    log.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: "
             + trigger.getCronExpression());

    // job 3 在8-17点的偶数分钟运行
    job = newJob(SimpleJob.class).withIdentity("job3", "group1").build();
    trigger = newTrigger().withIdentity("trigger3", "group1").withSchedule(cronSchedule("0 0/2 8-17 * * ?")).build();
    ft = sched.scheduleJob(job, trigger);
    log.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: "
             + trigger.getCronExpression());

    // job 4 在17-23点分钟是3的倍数运行
    job = newJob(SimpleJob.class).withIdentity("job4", "group1").build();
    trigger = newTrigger().withIdentity("trigger4", "group1").withSchedule(cronSchedule("0 0/3 17-23 * * ?")).build();
    ft = sched.scheduleJob(job, trigger);
    log.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: "
             + trigger.getCronExpression());

    // job 5 在每月1号或15号的10点运行
    job = newJob(SimpleJob.class).withIdentity("job5", "group1").build();
    trigger = newTrigger().withIdentity("trigger5", "group1").withSchedule(cronSchedule("0 0 10am 1,15 * ?")).build();
    ft = sched.scheduleJob(job, trigger);
    log.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: "
             + trigger.getCronExpression());

    // job 6 周一至周五的每30秒运行一次
    job = newJob(SimpleJob.class).withIdentity("job6", "group1").build();
    trigger = newTrigger().withIdentity("trigger6", "group1").withSchedule(cronSchedule("0,30 * * ? * MON-FRI"))
        .build();
    ft = sched.scheduleJob(job, trigger);
    log.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: "
             + trigger.getCronExpression());

    // job 7 在周六、周日的每30秒运行一次
    job = newJob(SimpleJob.class).withIdentity("job7", "group1").build();
    trigger = newTrigger().withIdentity("trigger7", "group1").withSchedule(cronSchedule("0,30 * * ? * SAT,SUN"))
        .build();
    ft = sched.scheduleJob(job, trigger);
    log.info(job.getKey() + " has been scheduled to run at: " + ft + " and repeat based on expression: "
             + trigger.getCronExpression());

    log.info("------- Starting Scheduler ----------------");

    // 调度器运行前所有任务不会运行
    sched.start();

    log.info("------- Started Scheduler -----------------");

    log.info("------- Waiting five minutes... ------------");
    try {
      Thread.sleep(300L * 1000L);
    } catch (Exception e) {
      e.printStackTrace();
    }

    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 {

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

}


Example4 向任务传递参数

// 接收参数和维护状态的示例,注意这两个注解
@PersistJobDataAfterExecution   // 每次执行后会持久化JobData
@DisallowConcurrentExecution    // 不允许并发执行
public class ColorJob implements Job {

    private static Logger _log = LoggerFactory.getLogger(ColorJob.class);
    
    // 静态参数
    public static final String FAVORITE_COLOR = "favorite color";
    public static final String EXECUTION_COUNT = "count";
    
    // 因为quartz每次执行任务时都会重新实例化一个类,所以非静态成员变量不能用来维护状态
    private int _counter = 1;

    public ColorJob() {
    }

    public void execute(JobExecutionContext context)
        throws JobExecutionException {
    	// 获取jobkey类似group1.job1
        JobKey jobKey = context.getJobDetail().getKey();
        
        // 获取并打印传递过来的参数
        JobDataMap data = context.getJobDetail().getJobDataMap();
        String favoriteColor = data.getString(FAVORITE_COLOR);
        int count = data.getInt(EXECUTION_COUNT);
        _log.info("ColorJob: " + jobKey + " executing at " + new Date() + "\n" +
            "  favorite color is " + favoriteColor + "\n" + 
            "  execution count (from job map) is " + count + "\n" + 
            "  execution count (from job member variable) is " + _counter);
        
        // 增加count并保存到job的map中,所以job状态可以维护
        count++;
        data.put(EXECUTION_COUNT, count);
        
        // 增加本地成员变量,通过成员变量不能维护job状态
        _counter++;
    }
}



public class JobStateExample {

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

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

		// 得到调度器的引用
		SchedulerFactory sf = new StdSchedulerFactory();
		Scheduler sched = sf.getScheduler();

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

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

		// 开始时间秒数是10的倍数
		Date startTime = nextGivenSecondDate(null, 10);

		// job1 会在秒数是10的倍数开始,重复4次,每10秒重复1次
		JobDetail job1 = newJob(ColorJob.class).withIdentity("job1", "group1")
				.build();
		SimpleTrigger trigger1 = newTrigger()
				.withIdentity("trigger1", "group1").startAt(startTime)
				.withSchedule(
						simpleSchedule().withIntervalInSeconds(10)
								.withRepeatCount(4)).build();
		// 向 job1 传递参数
		job1.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "Green");
		job1.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1);
		Date scheduleTime1 = sched.scheduleJob(job1, trigger1);
		log.info(job1.getKey() + " will run at: " + scheduleTime1
				+ " and repeat: " + trigger1.getRepeatCount()
				+ " times, every " + trigger1.getRepeatInterval() / 1000
				+ " seconds");

		// job2 会在秒数是10的倍数开始,重复4次,每10秒重复1次
		JobDetail job2 = newJob(ColorJob.class).withIdentity("job2", "group1")
				.build();
		SimpleTrigger trigger2 = newTrigger()
				.withIdentity("trigger2", "group1").startAt(startTime)
				.withSchedule(
						simpleSchedule().withIntervalInSeconds(10)
								.withRepeatCount(4)).build();
		// 向 job2传递参数
		job2.getJobDataMap().put(ColorJob.FAVORITE_COLOR, "Red");
		job2.getJobDataMap().put(ColorJob.EXECUTION_COUNT, 1);
		Date scheduleTime2 = sched.scheduleJob(job2, trigger2);
		log.info(job2.getKey().toString() + " will run at: " + scheduleTime2
				+ " and repeat: " + trigger2.getRepeatCount()
				+ " times, every " + trigger2.getRepeatInterval() / 1000
				+ " seconds");

		log.info("------- Starting Scheduler ----------------");

		// 所有的任务已加入调度器,但调度器未开始之前所有的任务都不会运行
		sched.start();

		log.info("------- Started Scheduler -----------------");

		log.info("------- Waiting 60 seconds... -------------");
		try {
			Thread.sleep(60L * 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 {

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

}


Example5 错失任务执行策略

/**
 * 一个哑任务,用于单元测试
 */
@PersistJobDataAfterExecution
@DisallowConcurrentExecution
public class StatefulDumbJob implements Job {
	// 常量
	public static final String NUM_EXECUTIONS = "NumExecutions";
	public static final String EXECUTION_DELAY = "ExecutionDelay";

	public StatefulDumbJob() {
	}

	public void execute(JobExecutionContext context)
			throws JobExecutionException {
		System.err.println("---" + context.getJobDetail().getKey()
				+ " executing.[" + new Date() + "]");

		// 取出job中的map中的数据,增加并重新放入job的map中
		JobDataMap map = context.getJobDetail().getJobDataMap();
		int executeCount = 0;
		if (map.containsKey(NUM_EXECUTIONS)) {
			executeCount = map.getInt(NUM_EXECUTIONS);
		}
		executeCount++;
		map.put(NUM_EXECUTIONS, executeCount);

		// 如果包含延迟字段,则模拟任务延迟5秒
		long delay = 5000l;
		if (map.containsKey(EXECUTION_DELAY)) {
			delay = map.getLong(EXECUTION_DELAY);
		}
		try {
			Thread.sleep(delay);
		} catch (Exception ignore) {
		}
		
		// 完成任务,打印完成语句
		System.err.println("  -" + context.getJobDetail().getKey()
				+ " complete (" + executeCount + ").");
	}
}



public class MisfireExample {

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

		log.info("------- Initializing -------------------");
		// 得到调度器的引用
		SchedulerFactory sf = new StdSchedulerFactory();
		Scheduler sched = sf.getScheduler();

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

		// 开始时间秒数是15的倍数
		Date startTime = nextGivenSecondDate(null, 15);

		// 有状态job1每3秒运行1次,但会延迟10秒(任务中睡眠了10秒模拟了执行任务需要10秒)
		JobDetail job = newJob(StatefulDumbJob.class).withIdentity(
				"statefulJob1", "group1").usingJobData(
				StatefulDumbJob.EXECUTION_DELAY, 10000L).build();
		SimpleTrigger trigger = newTrigger().withIdentity("trigger1", "group1")
				.startAt(startTime).withSchedule(
						simpleSchedule().withIntervalInSeconds(3)
								.repeatForever()).build();
		Date ft = sched.scheduleJob(job, trigger);
		log.info(job.getKey() + " will run at: " + ft + " and repeat: "
				+ trigger.getRepeatCount() + " times, every "
				+ trigger.getRepeatInterval() / 1000 + " seconds");

		// 有状态job2每3秒运行1次,但会延迟10秒(任务中睡眠了10秒模拟了执行任务需要10秒)
		// job2设置了策略,所以错失后会立即触发,而不会等到下一个触发点
		job = newJob(StatefulDumbJob.class).withIdentity("statefulJob2",
				"group1").usingJobData(StatefulDumbJob.EXECUTION_DELAY, 10000L)
				.build();
		trigger = newTrigger().withIdentity("trigger2", "group1").startAt(
				startTime).withSchedule(
				simpleSchedule().withIntervalInSeconds(3).repeatForever()
				// 设置错失触发后的调度策略
						.withMisfireHandlingInstructionNowWithExistingCount())
				.build();
		ft = sched.scheduleJob(job, trigger);
		log.info(job.getKey() + " will run at: " + ft + " and repeat: "
				+ trigger.getRepeatCount() + " times, every "
				+ trigger.getRepeatInterval() / 1000 + " seconds");

		log.info("------- Starting Scheduler ----------------");
		sched.start();
		log.info("------- Started Scheduler -----------------");

		try {
			Thread.sleep(600L * 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 {
		MisfireExample example = new MisfireExample();
		example.run();
	}

	//本范例中,触发的间隔被设置为3秒,但是由于任务体执行间睡眠10秒,导致了错失触发的产生。
	//实际运行的效果,2个任务执行的间隔为10秒。
	//由于丢失触发时,job2的策略是立即触发,而job1是等待下一次机会触发。所以job2会赶在job1的前头,最终运行次数大于job1。
}




  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值