Quartz简介

Quartz是OpenSymphony开源组织在Job scheduling领域又一个开源项目,它可以与J2EE和J2SE应用程序相结合,也可以单独使用。Quartz可以用来创建简单或为运行十个、百个,甚至是好几万个Jobs这样复杂的程序。Jobs可以做成标准的Java组件或EJBs

Quartz是一个完全有Java编写的开源作业调度框架。主要用到的设计模式有:Builder模式、组件模式、Factory模式、链式写法等。三个核心概念:调度器、任务、触发器

第一个Quartz程序

  1. 创建maven项目,加入Quartz依赖。搜索 https://mvnrepository.com

    复制下图中依赖至项目中
  2. 创建HelloJob类并实现Job接口,在execute方法中编写需要执行的任务。
public class HelloJob implements Job{

   public void execute(JobExecutionContext arg0) throws JobExecutionException {
   	// TODO Auto-generated method stub
   	//打印当前的执行时间,格式为2017-01-01 00:00:00
   	Date date=new Date();
   	SimpleDateFormat sf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
   	System.out.println("当前时间为:"+sf.format(date));
   	//编写具体的业务逻辑
   	System.out.println("hello world!");
   }

}
  1. 创建HelloScheduler类,并添加main方法。
public class HelloScheduler {
	/**
	 * @param args
	 * @throws SchedulerException 
	 * @throws InterruptedException 
	 */
	public static void main(String[] args) throws SchedulerException, InterruptedException {
		// TODO Auto-generated method stub
		//创建一个JobDetail实例,将该实例与HelloJob Class绑定
		JobDetail jobDetail=JobBuilder.newJob(HelloJob.class)
									.withIdentity("myJob", "group1").build();
		//创建一个Trigger实例,定义该Job立即执行,并且每隔两秒钟重复执行一次,直到永远
		Trigger trigger=TriggerBuilder.newTrigger().withIdentity("myTrigger", "group1")//定义name/group
							.startNow()  //一旦加入schedular,立即生效
							.withSchedule(SimpleScheduleBuilder.simpleSchedule() //使用SimpleTrigger
												.withIntervalInSeconds(2) //每隔两秒执行一次
												.repeatForever() //一直执行,直到程序死去
												).build();
		
		//创建Scheduler实例
		SchedulerFactory sFactory=new StdSchedulerFactory();
		Scheduler scheduler=sFactory.getScheduler();
		//打印当前时间
		Date date=new Date();
		SimpleDateFormat df=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
		System.out.println("scheduler时间为:"+df.format(date));
		scheduler.scheduleJob(jobDetail, trigger);
		//启动
		scheduler.start();
		//运行一段时间关闭
		Thread.sleep(10000);
		scheduler.shutdown();
	}
}

结果如下。

三个核心概念

  • Scheduler:调度器,所有的调度都是由它控制。
  • Trigger:启动器,定义触发的条件。
  • JobDetail & Job : JobDetail 定义的是任务数据,而真正的执行逻辑是在Job中。为什么设计成 JobDetail+Job,而不直接用Job呢?因为任务是有可能并发执行,如果Scheduler直接使用Job,就会存在对同一个Job实例并发访问的问题。而JobDetail & Job 方式,sheduler每次执行,都会根据JobDetail创建一个新的Job实例,这样就可以规避并发访问的问题。
    注:Trigger与Job是多对一的关系,即一个Job可以由多个Trigger来启动!
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐