Java任务调度类库Quartz初步

本文基于Quartz 2.2版本,官方地址如下:

http://www.quartz-scheduler.org/

现在网上关于Quartz的文章,大多都是1.x版本的,但在2.x版本之后,Quartz的语法已经有了很大的不同。

其中最主要的一点就是,Quartz废弃了很多类的构造方法,而改为采用这些类的建造者类(Builder)来初始化它们。

对于Quartz而言,有三个最为基础的组件:Scheduler、Job及Trigger。其中:

  • Scheduler是Quartz的执行对象,通过它来加载Job与Trigger,设置调度参数,以及启动、终止、暂停、恢复任务调度的执行过程;
  • Job是任务调度中的任务,它又分为两个模块:一是实现自Job接口的类,它负责完成任务中的各种操作行为;另一则是JobDetail类,它包含任务的全部信息,包括任务所需的数据以及行为(即JobDetail不仅要装载任务数据,还要加载实现自Job接口的行为类);
  • Trigger是任务的触发器,它设置了任务将于何时开始/结束、执行间隔、执行次数等信息。

如前所述,在1.x版本中,上述功能类的初始化都是通过其自身的构造方法完成的。但是到了2.x版本,绝大多数功能类的生成都需要通过专门的建造者来实现。下面的代码是一个例子:

import org.quartz.CalendarIntervalScheduleBuilder;
import org.quartz.CronScheduleBuilder;
import org.quartz.JobBuilder;
import org.quartz.JobDetail;
import org.quartz.Scheduler;
import org.quartz.SchedulerException;
import org.quartz.SimpleScheduleBuilder;
import org.quartz.Trigger;
import org.quartz.TriggerBuilder;
import org.quartz.impl.StdSchedulerFactory;

public class QuartzTest {

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

		Scheduler s = new StdSchedulerFactory().getScheduler();
		s.start();

		JobDetail job = JobBuilder.newJob().ofType(TestJob.class)
				.withIdentity("job1", "group1").build();
		Trigger trigger = TriggerBuilder
				.newTrigger()
				.withIdentity("trigger1", "group1")
				.startNow()
//				.withSchedule(SimpleScheduleBuilder.repeatSecondlyForTotalCount(10, 2))
//				.withSchedule(CronScheduleBuilder.cronSchedule("0 30 9 * * ?"))
				.withSchedule(CalendarIntervalScheduleBuilder.calendarIntervalSchedule().withIntervalInHours(2))
				.build();

		s.scheduleJob(job, trigger);

//		s.shutdown(true);
	}

}

从示例代码中可以看出,除了Scheduler以外,JobDetail和Trigger都是通过Builder生成的。

目前版本中,简单地,Scheduler的生成有两种方法,二者区别不大:

Scheduler s = new StdSchedulerFactory().getScheduler();

Scheduler s = StdSchedulerFactory.getDefaultScheduler();

只有调用了Scheduler的start方法后,任务调度才会开始。但是start的调用可以在JobDetail和Trigger的加载之前,也可以在之后。

JobDetail通过JobBuilder生成,而JobBuilder通过其静态方法newJob创建一个JobBuilder的实例。对于JobBuilder对象而言,ofType是必须调用的方法,通过它来加载实现了Job接口的类(示例中的TestJob类)。withIndentify方法将会生成一个JobKey的私有成员,它是JobDetail对象的唯一标志。

Trigger通过TriggerBuilder生成,TriggerBuilder通过其静态方法newTrigger创建一个TriggerBuilder的实例。与JobDetail相同,TriggerBuilder也通过withIndetify方法为Trigger对象创建唯一标志。此外,TriggerBuilder中还有startNow,startAt,endAt等方法,来设置任务触发及结束的时间。

如果用过1.x版本的Quartz,应该知道触发器还分为SimpleTrigger、CronTrigger等,但是在2.x版本中,这些具体的Trigger类都被废弃了,取而代之的是TriggerBuilder中的withSchedule方法。该方法需要传入一个SechduleBuilder对象,通过该对象来实现触发器的逻辑。

如示例中所示,2.2版本中的ScheduleBuilder有三种,分为是SimpleScheduleBuilder,CronScheduleBuilder及CalendarIntervalScheduleBuilder:

  • SimpleScheduleBuilder是简单调用触发器,它只能指定触发的间隔时间和执行次数;
  • CronScheduleBuilder是类似于Linux Cron的触发器,它通过一个称为CronExpression的规则来指定触发规则,通常是每次触发的具体时间;(关于CronExpression,详见:官方中文网文
  • CalendarIntervalScheduleBuilder是对CronScheduleBuilder的补充,它能指定每隔一段时间触发一次。

需要注意的是,withSchedule最多可能被同一个TriggerBuilder对象调用一次。若不调用,则任务会立即执行,且只执行一次。

另外,无论是JobDetail还是Trigger中,都拥有usingJobData来装载具体数据。

Scheduler对象可以通过许多方法来加载JobDetail和Trigger对象,scheduleJob方法是其中之一。此外还有addJob等。但需要注意的是,Scheduler中允许不存在JobDetail和Trigger,在此情况下调度器将空跑(即死循环);但是一旦加载了JobDetail,则至少必须加载一个Trigger,反之亦然。

当调用了shutdown方法后,调度器将结束循环,并终结其全部子线程。shutdown方法具有两个原型:

void shutdown();

void shutdown(boolean);

shutdown()等价于shutdown(false)。其布尔参数代表是否等待任务执行。若为false,则立即无条件结束调度;若为true,则允许当前正处于等待或正在执行的任务完成后再结束。

更多关于Quartz的信息,请参见Quartz的开发指南API文档

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值