2024年3月24日发(作者:)

使用Quartz调度器

Quartz调度器为调度工作提供了更丰富的支持。和Java定时器一样,可以使用

Quartz来每隔多少毫秒执行一个工作。但Quartz比Java Timer更先进之处在

于它允许你调度一个工作在某个特定的时间或日期执行。

创建一个类来定义工作

定义Quartz工作的第一步是创建一个类来定义工作。要做到这一点,你需

要从Spring的QuartzJobBean中派生子类,如程序清单7.3所示:

程序清单7.3 定义一个Quartz工作public class EmailReportJob extends

QuartzJobBean {

public EmailReportJob() {}

protected void executeInternal(JobExecutionContext context)

throws JobExecutionException {

urseEnrollmentReport();

}

private CourseService courseService;

public void setCourseService(CourseService courseService) {

Service = courseService;

}

}

class="ailBean"

>

eportJob

值得注意的是,在这里你并没有直接声明一个EmailReportJob Bean,而是声明

了一个JobDetailBean。这是使用Quartz时的一个特点。

JobDetailBean是Quartz的ail的子类,它要求通过

jobClass属性来设置一个Job对象。

使用Quartz的JobDetail中的另一个特别之处是EmailReportJob的

courseService属性是间接设置的。

JobDetail的jobDataAsMap属性接受一个,其中包含了需要设置

给jobClass的各种属性。

在这里,这个map包含了一个指向courseService Bean的引用,它的键值为

courseService。

当JobDetailBean实例化时,它会将courseService Bean注入到EmailReportJob

的courseService属性中。

调度工作

现在工作已经被定义好了,接下来你需要调度这个工作。

Quartz的r类描述了何时及以怎样的频度运行一个Quartz

工作。

Spring提供了两个触发器,SimpleTriggerBean和CronTriggerBean。你应该使

用哪个触发器?让我们分别考察一下这两个触发器,首先从SimpleTriggerBean

开始。

SimpleTriggerBean与ScheduledTimerTask类似。你可以用它来指定一个工

作应该以怎样的频度运行,以及(可选地)在第一次运行工作之前应该等待多久。

例如,要调度报表工作每24小时运行一次,第一次在1小时之后开始运行,可

以按照以下方式进行声明: