我有一个由许多可执行文件与数据库交互组成的大型Windows遗留应用程序。 可执行程序有四个主要目的:
(a)parsing并加载数据库上的文件
(b)转换一个文件(例如,编码一个文件)。这也可能在很多部分分割一个文件。
(c)在数据库中执行某种复杂的更新
(d)生成一个文件
这些可执行文件是由batch file调用的,这些batch file可以根据它们的function分为三类:
(1)等待一个条件,从某个外部path获取一个文件,可能将其转换为(b),做(c),发送有关活动结果的通知,向数据库写入一条logging
(2)等待一个条件,做一些(c),产生一个文件,用(b)变换它,然后将它复制到一个或多个目的地(本地文件,数据库,ftp),发送有关活动结果的通知,写一个logging到数据库。
(3)协调(abcd)可执行文件的其他复杂序列,发送有关活动结果的通知,将logging写入数据库
batch file是Windows机器上的普通BAT文件(可能互相调用)。 这些文件由调度程序启动。
问题是:
– 在每个batch file中,大部分有关环境的信息(通用目录等)都是重复的,而(1)或(2)types的大部分文件都非常相似。
batch file不容易configuration为testing环境,也不能自动轻松testing
– 通知和等待起始条件的代码部分重复(如果errorA呼叫b,如果错误b呼叫c,如果错误d呼叫e)。
– 使用goto
– 您无法准确确定哪些batch file已过时,哪些通常会被调用
– 要了解哪些文件发送或接收,您需要单独打开每个批次。
它们对应用程序施加devise约束,不能将通用代码抽象出来
– 要实现水平function(例如,有一个默认的日志logging策略,计算每个作业的调用时间),需要在许多文件上写入(不可维护的)代码。
从积极的一面:
batch file很容易被修改,所以如果一个批处理由于某种原因失败了,那么编写一个批处理就可以使情况恢复到安全状态。
他们是战斗testing的。 他们已经在生产很长一段时间了
我已经想出了这个解决scheme:
编写一些提供常用function和configuration的Java库(用于通知事件的function,传输文件的function,等待条件的function等)。
编写一个可以加载和执行任务类的Java“脚本引擎框架”命令行应用程序。 (任务类可以使用上述库中提供的function。)
脚本可以由用户根据需要在单独的jar中提供 。
脚本可以通过注释自动logging
脚本引擎可以要求脚本输出自己及其参数的描述
从复制中分离生成文件
我已经决定采用Java而不是脚本语言(PHP,Python),这样我就可以享受编译带来的好处,而且不必担心在公共库中写入可能触发“致命错误”的东西停止执行脚本。
我觉得这将简单地执行最标准的batch file(types1和types2),另一方面,我担心这将很难表示types3的批处理。另外,我会放置一个自动部署我担心的是编写一个不好的batch file可能会产生问题,在引擎本身中部署一些错误的代码(即使这样做可能不太可能因为编译和testing而发生),或者在configuration中可能会影响所有脚本。
请注意,系统应该是100%可靠的,并且要执行的系统任务有最后期限和“时间窗口”。
我的问题是:
你认为批量文件可以吗? 他们在这方面被广泛使用吗?
你觉得我正朝着正确的方向走吗? 有没有我没有考虑过的东西?
有没有人有更好的主意?
你知道任何框架可以帮助我吗?
你认为开发这个系统在未来有更大的灵活性是值得的吗?还是我最好保留批次?
请注意,任何要开发的新解决scheme都将与现有系统集成在一起,因此我不能在应用程序服务器中重写所有内容。
我在一个非常相似的应用程序上工作,调用OSQL的文件超过100个.cmd。 我们遇到过很多类似的问题,以及糟糕的错误处理问题。 在我看来,更好的选择是获得一个调度程序,它可以做你想做的事,而不是写一个框架来调度你的调度程序和批处理/脚本文件。 在我看来,这种类型的系统需要一个老式的Job Scheduler 。 它调用你的可执行文件的顺序,处理错误,并传递你的配置参数。 从Zena到JobScheduler有很多不同的选择。 我建议选择一个良好的图形用户界面。
我建议使用PowerShell 。
在我看来,这将是最不显眼的前进方式。 PowerShell支持所有你已经使用的shell命令,你可以开始创建PowerShell函数并获得一些代码重用,并减少逻辑重复。 Powershell脚本也很容易修改,就像批处理文件一样,并且在Window 7或Windows 2008上使用最新版本,您可以获得ISE(集成脚本环境),您可以逐步执行代码并交互式地进行调试。
如果您需要更高级的功能,您可以使用.NET框架来编写复杂的CmdLets(commandlets),并将它们用作Powershell脚本代码中的函数。
另一个好处是你不必对其他脚本环境进行精细的字符串操作,因为它们有一个对象流水线,它允许你编写复杂的命令,因此你可以使用一个命令的输出作为另一个命令的输入。
我每天使用PowerShell安装和卸载.NET程序集,部署和取消部署Microsoft BizTalk实体,运行数据库脚本以及创建,配置和删除网站。
快乐的脚本。
一个优秀的Powershell博客
http://pshscripts.blogspot.com/
你也可以尝试Quartz( http://www.quartz-scheduler.org/ )。 它是一个开源的免费调度工具,内置Java,支持许多不同类型的任务,并且可以使用各种数据库。 到目前为止,我已经使用它与DB2。 我们已经在生产中使用了2年以上,它的作品像一个魅力。 我们必须实现java服务包装程序,以便它作为服务运行,但这很容易完成。
如果我要替换批处理文件,我会用一些.NET语言来做。 .NET包含线程库,启动应用程序和轻松处理输出。 当然你也可以使用C#作为脚本语言,甚至是PowerShell或者Python。