Quartz的SchedulerFactory是标准的工厂类,不太适合在Spring环境下使用。此外,为了保证Scheduler能够感知Spring容器的生命周期,完成自动启动和关闭的操作,必须让Scheduler和Spring容器的生命周期相关联。以便在Spring容器启动后,Scheduler自动开始工作,而在Spring容器关闭前,自动关闭Scheduler。为此,Spring提供SchedulerFactoryBean,这个FactoryBean大致拥有以下的功能:
1)以更具Bean风格的方式为Scheduler提供配置信息;
2)让Scheduler和Spring容器的生命周期建立关联,相生相息;
3)通过属性配置部分或全部代替Quartz自身的配置文件。
来看一个SchedulerFactoryBean配置的例子:
代码清单 9 SchedulerFactoryBean配置
<bean id="scheduler" class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers"> ①注册多个Trigger
<list>
<ref bean="simpleTrigger" />
</list>
</property>
<property name="schedulerContextAsMap">②以Map类型设置SchedulerContext数据
<map>
<entry key="timeout" value="30" />
</map>
</property>
<property name="configLocation" value="classpath:com/baobaotao/quartz/quartz.properties" />
</bean>
SchedulerFactoryBean的triggers属性为Trigger[]类型,可以通过该属性注册多个Trigger,在①处,我们注册了一个Trigger。Scheduler拥有一个类似于ServletContext的SchedulerContext。SchedulerFactoryBean允许你以Map的形式设置SchedulerContext的参数值,如②所示。默认情况下,Quartz在类路径下查询quartz.properties配置文件,你也可以通过configLocation属性显式指定配置文件位置,如③所示。
除了实例中所用的属性外,SchedulerFactoryBean还拥有一些常见的属性:
●calendars:类型为Map,通过该属性向Scheduler注册Calendar;
●jobDetails:类型为JobDetail[],通过该属性向Scheduler注册JobDetail;
●autoStartup:SchedulerFactoryBean在初始化后是否马上启动Scheduler,默认为true。如果设置为false,需要手工启动Scheduler;
●startupDelay:在SchedulerFactoryBean初始化完成后,延迟多少秒启动Scheduler,默认为0,表示马上启动。如果并非马上拥有需要执行的任务,可通过startupDelay属性让Scheduler延迟一小段时间后启动,以便让Spring能够更快初始化容器中剩余的Bean。