·创建并运行 Quartz Scheduler
当调度器起来之后,你可以利用它做很多事情或者获取到它的许多信息。例如,你也许需要安排一些 Job 或者改变又安排在调度器上 Job 的执行次数。你也许需要让调度器处于暂停模式,接着再次启动它以便重新执行在其上安排的作业。当调度器处于暂停模式时,不执行任何作业,即使是作业到了它所期待的执行时间。
public class SimpleScheduler {
static Log logger = LogFactory.getLog(SimpleScheduler.class);
public static void main(String[] args) {
SimpleScheduler simple = new SimpleScheduler();
simple.startScheduler();
}
public void startScheduler() {
Scheduler scheduler = null;
try {
// Get a Scheduler instance from the Factory
scheduler = StdSchedulerFactory.getDefaultScheduler();
// Start the scheduler
scheduler.start();
logger.info("Scheduler started at " + new Date());
} catch (SchedulerException ex) {
// deal with any exceptions
logger.error(ex);
}
}
private void modifyScheduler(Scheduler scheduler) {
try {
if (!scheduler.isInStandbyMode()) {
// pause the scheduler
scheduler.standby();
}
// Do something interesting here
// and then restart it
scheduler.start();
} catch (SchedulerException ex) {
logger.error(ex);
}
}
}
·编程式安排一个 Quartz Job
所有的要 Quartz 来执行的作业必须通过调度器来注册。大多情况下,这会在调度器启动前做好。
因为每一个 Job 都必须用 Scheduler 来注册,所以先定义一个 JobDetail ,并关联到这个 Scheduler 实例。
public class JobScheduler {
static Log logger = LogFactory.getLog(JobScheduler.class);
public static void main(String[] args) {
JobScheduler example = new JobScheduler();
try {
// Create a Scheduler and schedule the Job
Scheduler scheduler = example.createScheduler();
example.scheduleJob(scheduler);
// Start the Scheduler running
scheduler.start();
logger.info( "Scheduler started at " + new Date());
} catch (SchedulerException ex) {
logger.error(ex);
}
}
/*
* return an instance of the Scheduler from the factory
*/
public Scheduler createScheduler() throws SchedulerException {
return StdSchedulerFactory.getDefaultScheduler();
}
// Create and Schedule a ScanDirectoryJob with the Scheduler
private void scheduleJob(Scheduler scheduler)
throws SchedulerException {
// Create a JobDetail for the Job
JobDetail jobDetail = new JobDetail("ScanDirectory",Scheduler.DEFAULT_GROUP,ScanDirectoryJob.class);
// Configure the directory to scan
jobDetail.getJobDataMap().put("SCAN_DIR","D:\\test");
// Create a trigger that fires every 10 seconds, forever
Trigger trigger = TriggerUtils.makeSecondlyTrigger(10);
trigger.setName("scanTrigger");
// Start the trigger firing from now
trigger.setStartTime(new Date());
// Associate the trigger with the job in the scheduler
scheduler.scheduleJob(jobDetail, trigger);
}
}
代码首先调用 createScheduler() 方法从 Scheduler 工厂获取一个 Scheduler 的实例。得到 Scheduler 实例之后,把它传递给 schedulerJob() 方法,由它把 Job 同 Scheduler 进行关联。
Trigger 的责任就是触发一个 Job 去执行。当用 Scheduler 注册一个 Job 的时候要创建一个 Trigger 与这个 Job 相关联。 Quartz 提供了四种类型的 Trigger ,但其中两种是最为常用的,它们就是在下面章节中要用到的 SimpleTrigger 和 CronTrigger .为更简单的使用 Trigger , Quartz 包含了一个工具类,叫做 org.quartz.TriggerUtils . TriggerUtils 提供了许多便捷的方法简化了构造和配置 trigger. 本章的例子中有用的就是 TriggerUtils 类; SimpleTrigger 和 CronTrigger 会在后面章节中用到。
调用了 TriggerUtils 的方法 makeSecondlyTrigger() 来创建一个每10 秒种激发一次的 trigger( 实际是由 TriggerUtils 生成了一个 SimpleTrigger 实例,但是我们的代码并不想知道这些) 。