任务调度概述

各种企业应用几乎都会遇到任务调度的需求,以论坛为例,每隔半小时生成精华文章的 RSS 文件,每天凌晨统计论坛用户的积分排名,每隔 30 分钟对锁定到期的用户进行解锁。对于一个典型的企业应用系统来说,每月1日凌晨统计上个月各部门的业务数据生成月报表,每隔半小时查询用户是否有快到期的待处理业务等,这样的例子俯拾皆是、不胜枚举。

以上所举调度场景的核心都是以时间为关注点的调度,即在特定的时间点执行指定的操作。如果将任务调度的范围稍微扩大一些,则还应该包括资源上的调度。如 Web Server 在接收到请求时,会立即创建一个新的线程服务该请求。但资源是有限的,无限制地使用必然耗尽亏空,大多数系统都要对资源使用进行控制。首先必须限制服务线程的最大数目;其次可以考虑使用线程池以便共享服务的线程资源,降低频繁创建、销毁线程的消耗。

任务调度本身涉及多线程并发、运行时间规则制定及解析、运行现场保持与恢复、线程池维护等诸多方面的工作。如果直接使用自定义线程这种刀耕火种的原始办法,则开发任务调度程序是一项颇具挑战性的工作。Java 开源的好处就是,领域问题都能找到现成的解决方案。

OpenSymphony 所提供的 Quartz 自 2001 年发布以来,已经被众多项目作为任务调度的解决方案。Quartz 在提供灵活性的同时并未牺牲其简单性,它所提供的强大功能使开发者可以轻松应对绝大多数任务调度的功能需求。

Sun 从 Java 1.3 开始,通过 java.util.Timer 和 TimerTask 提供了简单的调度功能,允许用户调度一个按固定时间间隔运行的任务。

针对前面提到的资源调度的要求,Java 5.0 通过 java.util.concurrent 这个新包中的若干类和接口,提供了方便的线程池调用功能。

Spring 对以上三者都提供了支持,通过  Spring 所提供的一系列 FactoryBean,可以很容易地创建任务调度框架的实例。此外,Spring 还提供了几个工具类,可以将某个具体 Bean 的方法直接作为被调度的任务,从而简化了任务的定义。Spring 还提供了支持线程池的调度执行器,它提供了一个抽象层,屏蔽了 Java 1.3、Java 1.4、Java 5.0 和 JavaEE 的环境差异。

本章选取 Quartz 1.8.6 版本进行示例说明(有关Quartz的详细说明,可查看其官网 http://www.quartz-scheduler.org/)。需要在 pom.xml 中加入如下版本依赖:

<dependency>
    <groupId>org.quartz-scheduler</groupId>
    <artifactId>quartz</artifactId>
    <version>1.8.6</version>
</dependency>
原文地址:https://www.cnblogs.com/jwen1994/p/11343205.html