Spring 中使用 Quartz
概述
各种企业应用几乎都会碰到任务调度的需求,就拿论坛来说:每隔半个小时生成精华文
章的 RSS 文件,每天凌晨统计论坛用户的积分排名,每隔 30 分钟执行锁定 用户解锁任务。
对于一个典型的 MIS 系统来说,在每月 1 号凌晨统计上个月各部门的业务数据生成月报表,
每半个小时查询用户是否已经有快到期的待处理业 务……,这样的例子俯拾皆是,不胜枚
举。
Quartz 在开源任务调度框架中的翘首,它提供了强大任务调度机制,难能可贵的是它
同时保持了使用的简单性。Quartz 允许开发人员灵活地定义触发器的调度时间表,并可
以对触发器和任务进行关联映射。此外,Quartz 提供了调度运行环境的持久化机制,可
以保存并恢复调度 现场,即使系统因故障关闭,任务调度现场数据并不会丢失。此外,
Quartz 还提供了组件式的侦听器、各种插件、线程池等功能。
Spring 为创建 Quartz 的 Scheduler、Trigger 和 JobDetail 提供了便利的
FactoryBean 类,以便能够在 Spring 容器中享受注入的好处。此外 Spring 还提供了一
些便利工具类直接将 Spring 中的 Bean 包装成合法的任务。Spring 进一步降低了使用
Quartz 的难度,能以更具 Spring 风格的方式使用 Quartz。概括来说它提供了两方面的
支持:
1)为 Quartz 的重要组件类提供更具 Bean 风格的扩展类;
2)提供创建 Scheduler 的 BeanFactory 类,方便在 Spring 环境下创建对应的组件对
象,并结合 Spring 容器生命周期进行启动和停止的动作。
创建 JobDetail
你可以直接使用 Quartz 的 JobDetail 在 Spring 中配置一个 JobDetail Bean,但是
JobDetail 使用带参的构造函数,对于习惯通过属性配置的 Spring 用户来说存在使用上的
不便。为此 Spring 通过扩展 JobDetail 提供了一个更具 Bean 风格的 JobDetailBean。
此外,Spring 提供了一个 MethodInvokingJobDetailFactoryBean,通过这个
FactoryBean 可以将 Spring 容器中 Bean 的方法包装成 Quartz 任务,这样开发者就不
必为 Job 创建对应的类。
JobDetailBean
JobDetailBean 扩展于 Quartz 的 JobDetail。使用该 Bean 声明 JobDetail 时,Bean
的名字即是任务的名字,如果没有指定所属组,即使用默认组。除了 JobDetail 中的属性
外,还定义了以下属性:
● jobClass:类型为 Class,实现 Job 接口的任务类;
● beanName:默认为 Bean 的 id 名,通过该属性显式指定 Bean 名称,它对应任务
的名称;
● jobDataAsMap:类型为 Map,为任务所对应的 JobDataMap 提供值。之所以需要
提供这个属性,是因为除非你手工注册一 个编辑器,你不能直接配置 JobDataMap 类型
的值,所以 Spring 通过 jobDataAsMap 设置 JobDataMap 的值;
●applicationContextJobDataKey:你可以将 Spring ApplicationContext 的引用
保存到 JobDataMap 中,以便在 Job 的代码中访 问 ApplicationContext。为了达到这
评论1