调度一个作业
让我们通过看一个例子来进入实际讨论。现假定你管理一个部门,无论何时候客户在它的FTP服务器上存储一个文件,都得用电子邮件通知它。我们的作业将用FTP登陆到远程服务器并下载所有找到的文件。
然后,它将发送一封含有找到和下载的文件数量的电子邮件。这个作业很容易就帮助人们整天从手工执行这个任务中解脱出来,甚至连晚上都无须考虑。我们可以设置作业循环不断地每60秒检查一次,而且工作在7×24模式下。这就是Quartz框架完全的用途。

首先创建一个Job类,将执行FTP和Email逻辑。下例展示了Quartz的Job类,它实现了org.quartz.Job接口。

例2.从FTP站点下载文件和发送email的Quartz作业
请输入内容
public class ScanFTPSiteJob implements Job {
    private static Log logger = LogFactory.getLog(ScanFTPSiteJob.class);
    /*
     * Called the scheduler framework at the right time
     */
    public void execute(JobExecutionContext context)
             throws JobExecutionException {
       JobDataMap jobDataMap = context.getJobDataMap();
       try {
             // Check the ftp site for files
             File[] files = JobUtil.checkForFiles(jobDataMap);
             JobUtil.sendEmail(jobDataMap, files);
       } catch (Exception ex) {
          throw new JobExecutionException(ex.getMessage());
       }
    }
}

我们故意让ScanFTPSiteJob保持很简单。我们为这个例子创建了一个叫做 JobUtil的实用类。它不是Quartz的组成部分,但对构建各种作业能重用的实用程序库来说是有意义的。我们可以轻易将那种代码组织进作业类中, quarts 调度器一样好用,因为我们一直在使用quarts,所以那些代码可继续重用。
JobUtil.checkForFiles() and JobUtil.sendEmail()方法使用的参数是Quartz创建的JobDataMap的实例。实例为每个作业的执行而创建,它是向作业类传递配置参数的方法。
这里并没有展示JobUtil的实现,但我们能用Jakarta上的Commons Net轻易地实现FTP和Email功能。

用调度器调用作业
首先创建一个作业,但为使作业能被调度器调用,你得向调度程序说明你的作业的调用时间和频率。这个事情由与作业相关的触发器来完成。因为我们仅仅对大约每60秒循环调用作业感兴趣,所以打算使用SimpleTrigger。
作业和触发器通过Quartz调度器接口而被调度。我们需要从调度器工厂类取得一个调度器的实例。最容易的办法是调用StdSchedulerFactory这个类上的静态方法getDefaultScheduler()。
使用Quartz框架,你需要调用start()方法来启动调度器。例3的代码遵循了大多数Quartz应用的一般模式:创建一个或多个作业,创建和设置触发器,用调度器调度作业和触发器,启动调度器。

例3.Quartz作业通过Quartz调度器而被调度
public class MyQuartzServer {
    public static void main(String[] args) {
       MyQuartzServer server = new MyQuartzServer();
       try {
             server.startScheduler();
       } catch (SchedulerException ex) {
          ex.printStackTrace();
       }
    }

    protected void startScheduler() throws SchedulerException {
       // Use the factory to create a Scheduler instance
       Scheduler scheduler = StdSchedulerFactory.getDefaultScheduler();

       // JobDetail holds the definition for Jobs
       JobDetail jobDetail = new JobDetail("ScanFTPJob",
                 Scheduler.DEFAULT_GROUP, ScanFTPSiteJob.class);

        // Store job parameters to be used within execute()
        jobDetail.getJobDataMap().put("FTP_HOST",
                                      "\\home\\cavaness\\inbound");
        // Other neccessary Job parameters here
        // Create a Trigger that fires every 60 seconds
        Trigger trigger = TriggerUtils.makeSecondlyTrigger(60);

        // Setup the Job and Trigger with the Scheduler
        scheduler.scheduleJob(jobDetail, trigger);

        // Start the Scheduler running
        scheduler.start();
    }
}