第一章. 企业应用中的作业调度
·什么是作业调度
·作业调度为什么说是重要的
·企业应用中的作业调度
·非企业应用中的作业调度
·作业调度与工作流
·关于作业调度其他可选择方案
1. 什么是作业调度
“作业”,这一技术述语上的概念,又让我们回到了大型机的年代,那时候,用户/程序员提交一叠穿孔卡片或者纸带(上面描述了一个作业)给操作人员,由操作人员帮忙执行那些作业。用户等待作业执行完后,回到主机那边取自己的卡片和打印出来的输出结果。
因为不是每一个作业要求立即被执行,所以作业可以被安排在将来的某个时候执行。比如说,一个系统管理员每天晚上可能有一份要执行的作业列表:
· 10:00 PM: 运行患者信息文件的上载作业
· 11:00 PM: 运行销售数据报表生成
· 11:59 PM: 进行数据库的备份
作业调度通常是指运行一个批量的作业或称之谓批处理。这种批处理作业一般都是放在后台运行并且不需要与用户交互。现在,显著增多的多样性的任务已代替了早先的批量作业。在一个大的组织中每天的每小时跑上百个作业已属普遍。并且作业的规模与复杂性仍在持续的上扬,因此批量作业和作业调度器也就随需应生。
2. 作业调度为什么说是重要的
俗话说,“时间就是金钱。”,过高的资源投入到枯燥的任务中无疑是金钱和资源的浪费。随着业务流程复杂性的提升,自动化流程也更能显现出它的有益之处来。图 1.1 说明了这一问题。
图1.1 任务规规模越大、越复杂、越频繁的被执行,那么能从自动化中获益也越大
人之所以称之为人,国为我们犯错误的频度远高于电脑。把一系列任务自动安置到一个作业中,然后再为这个作业创建一个调度器,到时这个作业就会自动执行了。相对于人的手工处理,我们可以减少大多数的出错机会。
作业调度器的另一个优点体现在伸缩性。我们也许能一个小时中手工完成10或20个作业,但是随着每小时处理作业数量的增加,我们就更难杜绝不在作业中引入错误。但如果借助于作业调度,只会受到硬件资源的影响了。
所以我们能着实的说通过作业调度那样自动化处理相对于手工来说,至少为我们提供了以下三个优点:
·资源使用效率更高
·更少的出错机率
·更高的伸缩性
3. 企业应用中的作业调度
“企业应用”一词,如今经常会被我们无意识间提及,然而似乎现在还没有对它一个准确的定义。但对于在本书中这一词的意义,我们只要建立起这样一个概念:作为某一组织的一部份而存在的软件系统或程序。这个系统可以是一个大型机上的、或者是一个C/S结构的、或者就是一个J2EE应用。真实世界中的例子就是,作业调度器能在那个系统上大量的使用。以下的几个场景,尽管没有详尽的进行描绘,也涉及到了现今应用软件常常遇到的场景。
场景 #1: 邮件提醒和告警
许多网站(不管是商业的还是别的)允许用户提供用户名和密码注册一个帐户。出于安全考虑,一个好的做法是让用户密码每隔一段时间过期失效,比如说90天的周期。这种情况下,你可以创建一个作业,让它每天午夜运行一次,并且向离过期时间不到三天的所有用户发邮件提醒。这里可以恰到好处的用到作业调度器。图 1.2 描绘了密码这个提醒作业。
图 1.2 密码过期的作业每晚发送邮件给密码很快会过期的用户
除了发过期的密码信息,网站还可以发送其他的告警或提醒(可不是垃圾邮件哦)。一个作业调度器还能够用在类似的其他方面。
场景 #2: 执行文件传输操作
许多商家需要和他们的供应商或客户作信息集成。一种集成的方式就是进行数据文件的交换。可以采用实时的方式,例如SOAP协议,但是许多时候却不需要实时性,代之以异步的方式,譬如用FTP协议来发出或取所要的文件。
下图描绘了一个劳工补偿局每天早上收到一些包含患者及事故信息的文件。公司可以雇一个人每天早上手工的检出FTP服务器上的文件。作为另一个更好的选择就是可以写一个作业,让它每天早上扫描FTP服务器,如果有文件的话,把文件内容处理后插入到患者数据库中去。让作业调度器代劳后,这个职员再也不用手工去上FTP检查文件,而可以为公司做更多别的更有意义的事情。图1.3 描绘了文件传输的操作。
图 1.3. 文件传输的作业检查FTP站点,把患者信息文件处理到数据库中。
场景 #3: 创建销售报表
公司经营由盈亏账目所驱动,其中一个很重要的事情就是经营管理者和财务人员需要拿到最终收入和毛利数据进行分析。抽取销售报表数据可能非常的慢并且很耗资源,因为这通常需要联合多个表从中查询出上千条记录。一个更好的解决途径是在晚上计帐和计价结束后,运行一个作业,让它去生成一些临时表或视图为报表程序所用。创建临时表或视图的方式,使报表生成更具动态特性,而且用户也用不着平白去等待报表的生成,一些报表工具,如水晶报表 XI(Crystal Reports XI) 本身就包含了作业调度器(见图1.4)。
图 1.4. 销售数据报表程序执行为销售团队产生收入和毛利信息
4. 非企业应用中的作业调度
Quartz 对于许多非企业环境的应用也是很有帮助的。例如,假定你有一个独立的应用程序,事件是基于时钟而不是鼠标的点击激发的。这时候你就可以把Quartz构建到这个应用程序中来,并且安排事件能周期性的被触发。
另一例子是,你也许正想查询数据库并发送邮件,而邮件接受者正是基于这些数据得到的。(译者注:真有些搞不明白)
5. 作业调度与工作流
作业调度不是工作流,理解这一点很重的要。它们常被同时应用于一个方案中,但它们是两个截然不同的解决办法,并且都可孤立使用。一个作业通常由几个步骤组成。我们回过头来看前面提到的那个密码过期的作业,实质上它是由三个步骤所组成。
1. 获取到密码将要过期的用户列表
2. 为列表中的用户各自发送一个邮件
3. 更新记录,下次就能知道哪些邮件发送过
这个作业可以使用工作流的优点,作业的每一部份恰好对应着工作流的每一个步骤。这并非意味着离开了工作流,作业调度会有些糟。这是普通的下一步、下一步简单操作。只要作业调度框架与第三方工作流能轻便的解决问题,就是好的。更多的关于Quartz和工作流的内容将会在第十四章,“使用Quartz和工作流”详解。
6. 关于作业调度其他可选择方案
正如你所知,这本书是讲Quartz的,但是Quartz的可替代方案呢?当我们比较作业调度方案的时候肯定要提到别的同类应用,那么现在就来简单介绍一下它们。
Java SDK Timer 和 TimerTask 类
java.util.Timer和java.util.TimerTask这两个类是自1.3版本才加入到JDK中来的。这两个新类可以实现一个最基本的调度器。也就只能作为我们理想的完整调度器框架的一个小的部件。任何严格意义的作业调度器都提供直接指定执行时间,存储作业信息到多种介绍和使用钩子进行定制及其他更多的功能。单纯靠JDK的那两个类还不足以构建一个真正的作业调度器。JAVA的Timer类也没办法对作业和触发器作相应的组织,使用每任务一个线程,而不是线程池的方式,还有其他不足之处难以成全其实现一个完全意义的作业调度器。
本土方案
从前面提到的Timer和TimerTask类来看,我们很容易低估创建一个灵活的、并且日后可扩展的作业调度器所作出的努力。创建一个作业调度器也不视之为微不足道的活儿。它需要的不仅仅是Java线程方面的专业技术,还需要解决其他更复杂的课题。如果你没有这方面成熟的专业知识,别想着作业调度器能直接随意一份草稿能一蹴而就。
商业解决方案
现在市面上也能见到不少商业的作业调度产品。在本书中,我们不打算花功夫去了解和评估那些商业化产品。表1.1 中列出了当下流行的几个解决方案,你可以通过所给相应的URL获得更详尽的信息。
表 1.1 商业作业调度器