Java定时任务Quartz二

1.Trigger通用属性

      Trigger的触发器通用属性:JobKey——job实例的标识,触发器被触发时,该指定的job实例会执行;StartTime——表示触发器的时间表首次被触发的时间,它的值的类型是Java.util.Date;EndTime——指定触发器不再被触发的时间,它的值的类型是Java.util.Date;Job示例代码如下:

package com.luna.timer.quarts;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.Job;
import org.quartz.JobExecutionContext;
import org.quartz.JobExecutionException;
import org.quartz.JobKey;
import org.quartz.Trigger;
public class HelloJob implements Job{
	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		//打印当前执行时间
		Date startTime = new Date();
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("任务执行时间为:"+sf.format(startTime));
		Trigger currentTrigger = context.getTrigger();
		System.out.println("Start Time is:"+sf.format(currentTrigger.getStartTime()));
		System.out.println("End Time is:"+sf.format(currentTrigger.getEndTime()));
		JobKey jobKey = currentTrigger.getJobKey();
		System.out.println("JobKey info---"+"jobName:"+jobKey.getName()+"jobGroup:"+jobKey.getGroup());
	}
}

Trigger示例代码如下:

package com.luna.timer.quarts;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
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 {
		// 创建一个JobDetail实例与HelloJob类绑定
		JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1").build();
		//打印当前时间
		Date startTime = new Date();
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("打印当前时间:"+sf.format(startTime));
		//获取当前时间3秒后的时间
		startTime.setTime(startTime.getTime()+3000);
		//获取当前时间6秒后的时间
		Date endDate = new Date();
		endDate.setTime(endDate.getTime()+6000);
		// 创建一个Trigger实例,定义该Job立即执行,且每隔两秒钟执行一次直到永远
		Trigger trigger = TriggerBuilder.newTrigger().
				withIdentity("mtTrigger", "group1").
				startAt(startTime).endAt(endDate).
				withSchedule(SimpleScheduleBuilder.simpleSchedule().
				withIntervalInSeconds(2).repeatForever()).build();
		//创建scheduler实例
		SchedulerFactory sFactory = new StdSchedulerFactory();
		Scheduler scheduler = sFactory.getScheduler();
		scheduler.start();
		scheduler.scheduleJob(jobDetail,trigger);
	}
}

2.浅谈SimpleTrigger

      SimpleTrigger:在一个指定时间段内执行一次作业任务,或者是在指定的时间间隔内多次执行作业任务。创建定时任务:距离当前时间4秒之后执行且仅执行一次,代码如下:

package com.luna.timer.quarts;
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{
	@Override
	public void execute(JobExecutionContext context) throws JobExecutionException {
		//打印当前执行时间
		Date startTime = new Date();
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("任务执行时间为:"+sf.format(startTime));
		System.out.println("Hello World!");
	}
}
package com.luna.timer.quarts;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class HelloScheduler {
	public static void main(String[] args) throws SchedulerException {
		// 创建一个JobDetail实例与HelloJob类绑定
		JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1").build();
		//打印当前时间
		Date startTime = new Date();
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("打印当前时间:"+sf.format(startTime));
		//获取距离当前时间4秒之后的时间
		startTime.setTime(startTime.getTime()+4000L);
		// 创建一个Trigger实例,距离当前时间4秒钟后执行且仅执行一次任务
		SimpleTrigger trigger = (SimpleTrigger)TriggerBuilder.newTrigger().
				withIdentity("mtTrigger", "group1").startAt(startTime).build();
		//创建scheduler实例
		SchedulerFactory sFactory = new StdSchedulerFactory();
		Scheduler scheduler = sFactory.getScheduler();
		scheduler.start();
		scheduler.scheduleJob(jobDetail,trigger);
	}
}

       创建定时任务:距离当前时间4秒之后执行之后每隔两秒执行一次,距离当前时间6秒之后停止执行,代码如下:

package com.luna.timer.quarts;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class HelloScheduler {
	public static void main(String[] args) throws SchedulerException {
		// 创建一个JobDetail实例与HelloJob类绑定
		JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1").build();
		//打印当前时间
		Date startTime = new Date();
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("打印当前时间:"+sf.format(startTime));
		//获取距离当前时间4秒之后的时间
		startTime.setTime(startTime.getTime()+4000L);
		// 创建一个Trigger实例,距离当前时间4秒钟后执行任务,之后每隔两秒执行一次任务
		//withRepeatCount方法参数:SimpleTrigger.REPEAT_INDEFINITELY永远执行下去,若设置为具体数字则就执行几次
		SimpleTrigger trigger = (SimpleTrigger)TriggerBuilder.newTrigger().
				withIdentity("mtTrigger", "group1").startAt(startTime).
				withSchedule(SimpleScheduleBuilder.simpleSchedule().
				withIntervalInSeconds(2).withRepeatCount(SimpleTrigger.REPEAT_INDEFINITELY)).build();
		//创建scheduler实例
		SchedulerFactory sFactory = new StdSchedulerFactory();
		Scheduler scheduler = sFactory.getScheduler();
		scheduler.start();
		scheduler.scheduleJob(jobDetail,trigger);
	}
}

       创建定时任务:距离当前时间4秒之后执行之后每隔两秒执行一次,永远执行下去,代码如下:

package com.luna.timer.quarts;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.SimpleTrigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class HelloScheduler {
	public static void main(String[] args) throws SchedulerException {
		// 创建一个JobDetail实例与HelloJob类绑定
		JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1").build();
		//打印当前时间
		Date startTime = new Date();
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("打印当前时间:"+sf.format(startTime));
		//获取距离当前时间4秒之后的时间
		startTime.setTime(startTime.getTime()+4000L);
		//获取6秒之后的时间
		Date endDate = new Date();
		endDate.setTime(endDate.getTime()+6000L);
		/**
		 * 创建一个Trigger实例,距离当前时间4秒钟后执行任务,之后每隔两秒执行一次任务,距离当前6秒之后停止执行
		 * withRepeatCount方法参数:SimpleTrigger.REPEAT_INDEFINITELY永远执行下去,若设置为具体数字则就执行几次
		 * 任务只执行两次,由此可见endDate条件是优先于withRepeatCount
		 */
		SimpleTrigger trigger = (SimpleTrigger)TriggerBuilder.newTrigger().
				withIdentity("mtTrigger", "group1").startAt(startTime).endAt(endDate).
				withSchedule(SimpleScheduleBuilder.simpleSchedule().
				withIntervalInSeconds(2).withRepeatCount(5)).build();
		//创建scheduler实例
		SchedulerFactory sFactory = new StdSchedulerFactory();
		Scheduler scheduler = sFactory.getScheduler();
		scheduler.start();
		scheduler.scheduleJob(jobDetail,trigger);
	}
}

       注意:重复次数(withRepeatCount)可以为0、正整数或者是SimpleTrigger.REPEAT_INDEFINITELY常量值;重复的执行间隔必须为0或者长整数;一旦被制定了endTime参数,那么它会覆盖重复次数参数的效果。

3.浅谈CronTrigger

      CornTrigger:基于日历的作业调度器,而不是像SimpleTrigger那样精确指定间隔时间,比SimpleTrigger更常用。基于Cron表达式,用于配置CronTrigger实例,是由7个子表达式组成的字符串,描述了时间表的详细信息。格式: [秒] [分] [小时][日] [月] [周] [年],示例代码如下:

package com.luna.timer.quarts;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class HelloScheduler {
	public static void main(String[] args) throws SchedulerException {
		// 创建一个JobDetail实例与HelloJob类绑定
		JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1").build();
		//打印当前时间
		Date startTime = new Date();
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("打印当前时间:"+sf.format(startTime));
		//每秒钟触发一次任务
		CronTrigger trigger = (CronTrigger)TriggerBuilder.newTrigger().
				withIdentity("mtTrigger", "group1").
				withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ? *")).
				build();
		//创建scheduler实例
		SchedulerFactory sFactory = new StdSchedulerFactory();
		Scheduler scheduler = sFactory.getScheduler();
		scheduler.start();
		scheduler.scheduleJob(jobDetail,trigger);
	}
}

      常用Corn表达式:

  • 2017年内每天10点15分触发一次:0 15 10 ? * * 2017
  • 每天10点15分触发:0 15 10 ? * *
  • 每天下午的2点到2点59分执行(整点开始,每隔5分钟触发):0 0/5 14 * * ?
  • 从周一到周五的每天上午10点15分触发:0 15 10 ? * MON-FRI
  • 每月第三周的星期五(6#3:6代表星期五,#代表第)10点15分开始触发:0 15 10 ? 6#3
  • 从2016年到2017年每月最后一周的星期五10点15分触发:0 15 10 ? * 6L 2016-2017
  • 每天14点整至14点59分55秒及18点整至18点59分55秒,每5秒触发一次:0/5 * 14,18 * * ?
  说明:'L'和'W'可以一起组合使用;周字段英文字母不区分大小写,即MON和mon意识相同;可以利用在线工具自动生成。

4.浅谈Scheduler

      Scheduler——工厂模式:所有的Scheduler实例应该由SchedulerFactory来创建,一般包含:StdSchedulerFactory、DirectSchedulerFactory(参数信息需要在代码中维护故不常用)。StdSchedulerFactory使用一组参数来创建和初始化Quartz调度器,配置参数一般存储在quartz.properties文件中,调用getScheduler方法就能创建和初始化调度器对象。Scheduler的主要函数:Data scheduleJob(JobDetail jobDetail,Trigger trigger);返回最近一次任务将要执行的时间,代码如下:

package com.luna.timer.quarts;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class HelloScheduler {
	public static void main(String[] args) throws SchedulerException {
		// 创建一个JobDetail实例与HelloJob类绑定
		JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1").build();
		//打印当前时间
		Date startTime = new Date();
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("打印当前时间:"+sf.format(startTime));
		//每天10点15分触发:0 15 10 ? * *
		//每天下午的2点到2点59分执行(整点开始,每隔5分钟触发):0 0/5 14 * * ?
		//从周一到周五的每天上午10点15分触发:0 15 10 ? * MON-FRI
		//每月第三周的星期五(6#3:6代表星期五,#代表第)10点15分开始触发:0 15 10 ? 6#3
		//从2016年到2017年每月最后一周的星期五10点15分触发:0 15 10 ? * 6L 2016-2017
		CronTrigger trigger = (CronTrigger)TriggerBuilder.newTrigger().
				withIdentity("mtTrigger", "group1").
				withSchedule(CronScheduleBuilder.cronSchedule("0 15 10 ? * *")).
				build();
		//创建scheduler实例
		SchedulerFactory sFactory = new StdSchedulerFactory();
		Scheduler scheduler = sFactory.getScheduler();
		scheduler.start();
		System.out.println("Schedule time is:"+sf.format(scheduler.scheduleJob(jobDetail,trigger)));
	}
}

      void start();——启动Scheduler;void standby();——将Scheduler暂时挂起,可以用start()继续执行任务;void shutDown()关闭Scheduler且不能被重启;示例代码如下:

package com.luna.timer.quarts;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.quartz.CronScheduleBuilder;
import org.quartz.CronTrigger;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SchedulerFactory;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;
public class HelloScheduler {
	public static void main(String[] args) throws SchedulerException, InterruptedException {
		// 创建一个JobDetail实例与HelloJob类绑定
		JobDetail jobDetail = JobBuilder.newJob(HelloJob.class).withIdentity("myJob", "group1").build();
		//打印当前时间
		Date startTime = new Date();
		SimpleDateFormat sf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("打印当前时间:"+sf.format(startTime));
		//每秒钟执行一次,Scheduler执行两秒之后挂起,Scheduler挂起3秒之后重新启动
		CronTrigger trigger = (CronTrigger)TriggerBuilder.newTrigger().
				withIdentity("mtTrigger", "group1").
				withSchedule(CronScheduleBuilder.cronSchedule("* * * * * ?")).
				build();
		//创建scheduler实例
		SchedulerFactory sFactory = new StdSchedulerFactory();
		Scheduler scheduler = sFactory.getScheduler();
		scheduler.start();
		System.out.println("Schedule time is:"+sf.format(scheduler.scheduleJob(jobDetail,trigger)));
		Thread.sleep(2000L);
		scheduler.standby();
		Thread.sleep(3000L);
		scheduler.start();
		/**
		 * shutDown()可以传入一个Boolean类型的参数,若参数为true:表示等待所有正在执行的job执行完毕之后,再关闭scheduler
		 * 若参数为false,即和没有传入参数一样,表示直接关闭scheduler,不管是否有Job正在运行
		 */
		scheduler.shutdown(); //关闭之后不可以重新开启
		Thread.sleep(5000L);
		scheduler.start();//调用重新开启抛出异常:The Scheduler cannot be restarted after shutdown() has been called.
	}
}

      线程池属性:threadCount——工作者线程的数目,最少为1,最大不超过100;threadPriority——设置线程池线程的优先级,最小值为1,最大值为10,默认值为5;org.quartz.threadPool.class——org.quartz.simple.SimpleThreadPool;作业存储设置——描述了在调度器实例的生命周期中,job和trigger信息是如何被存储的;插件配置——满足特定需求用到的Quartz插件的配置。

5.Quartz实际应用

  • Spring配置Quartz作业的两种方式:MethodInvokingJobDetailFactoryBean、JobDetailFactoryBean。
  • Spring整合Quartz项目代码参见GitHub:https://github.com/GandophSmida/spring-quartz
    原文地址:https://blog.csdn.net/u011635492/article/details/80552481

你可能感兴趣的:(Java,Quartz,Java高级架构师成长之路)