3

我有一个由许多与数据库交互的可执行文件组成的大型 Windows 遗留应用程序。可执行文件有 4 个主要用途:

(a) 解析和加载数据库上的文件

(b) 转换文件(例如对文件进行编码)。这也可以将文件分成许多部分。

(c) 在数据库中执行某种复杂的更新

(d) 制作档案

这些可执行文件由批处理文件调用,根据它们的作用可以分为三种类型:

(1) 等待某个条件,从某个外部路径获取文件,可能用 (b) 对其进行转换,执行 (c),发送有关活动结果的通知,将记录写入数据库

(2)等待一个条件,做一些(c),产生一个文件,用(b)转换它,然后将它复制到一个或多个目的地(本地文件,数据库,ftp),发送有关活动结果的通知,将记录写入数据库。

(3)协调(abcd)可执行文件的其他复杂序列,发送有关活动结果的通知,将记录写入数据库

批处理文件是 Windows 机器上的普通 BAT 文件(可能相互调用)。这些文件由调度程序启动。

问题是:

- 在每个批处理文件中,大部分关于环境的信息(公共目录等)都是重复的,大多数类型 (1) 或 (2) 的文件也非常相似。

- 批处理文件不容易为测试环境配置,也不容易自动测试

-通知和等待开始条件的代码部分重复es(如果错误A调用b,如果错误b调用c,如果错误d调用e)。

-goto的使用

-您无法准确跟踪哪些批处理文件已过时以及哪些批处理文件经常被调用

- 要了解发送或接收的文件,您需要单独打开每个批次。

- 它们对应用程序施加设计约束,无法抽象出通用代码

-要实现水平功能(例如,具有默认日志记录策略,计算每个作业被调用的次数)需要在许多文件上编写(不可维护?)代码。

从积极的一面:

  • 批处理文件很容易修改,因此如果批处理由于某种原因失败,编写批处理将情况恢复到安全状态并不困难。

  • 他们经过实战考验。他们已经生产了很长时间

我想出了这个解决方案:

  • 编写一些 Java 库,我在其中提供常用功能和配置(通知人们事件的功能、传输文件的功能、等待条件的功能。

  • 编写一个可以加载和执行任务类的Java“脚本引擎框架”命令行应用程序。(任务类可以使用上述库中提供的功能。)

  • 用户可以根据需要在单独的jar中在类中提供脚本。

  • 脚本可以通过注释自动记录

  • 脚本引擎可以要求脚本输出对自身及其参数的描述

  • 将文件的制作与复制分开


我决定支持 Java,而不是脚本语言(PHP、Python),这样我就可以从编译中受益,而不必担心在公共库中编写可能触发“致命错误”的东西,并且停止执行脚本。

我觉得这将简化大多数标准批处理文件(类型 1 和 2)的执行,另一方面,我担心表示类型 3 的批处理会很困难。我还将实施自动部署和我担心的是,虽然编写错误的批处理文件会产生问题,但在引擎本身(即使由于编译和测试而不太可能发生)或配置中部署一些错误代码可能会产生影响所有脚本的更大问题。

请注意,系统应该是 100% 可靠的,并且系统任务的执行存在截止日期和“时间窗口”。

我的问题是:

您认为批处理文件可以吗?它们在这种情况下被广泛使用吗?

你认为我的方向正确吗?有什么我没有考虑到的吗?<

有没有人有更好的主意?

你知道任何可以帮助我的框架吗?

您认为是否值得开发这个系统以在未来具有更大的灵活性,或者我最好保留批次?

请注意,任何要开发的新解决方案最初都将与现有系统集成,因此我不能例如重写所有内容以在应用程序服务器中工作。

4

4 回答 4

3

我建议使用PowerShell

在我看来,这将是最不引人注目的前进方式。PowerShell 支持您一直在使用的所有 shell 命令,而且您可以开始创建 PowerShell 函数并获得一些代码重用并减少逻辑重复。此外,Powershell 脚本也很容易修改,就像您的批处理文件一样,使用 Window 7 或 Windows 2008 上的最新版本,您可以获得一个 ISE(集成脚本环境),您可以单步调试您的代码并进行交互式调试。

如果您需要更高级的功能,您可以使用 .NET 框架来编写复杂的 CmdLet(命令)并将它们用作您的 Powershell 脚本代码中的函数。

另一个好处是您不必像在其他脚本环境中那样进行繁琐的字符串操作,因为它们有一个对象管道,允许您编写复杂的命令,因此您可以将一个命令的输出用作另一个命令的输入。

我每天都使用 PowerShell 来安装和卸载 .NET 程序集、部署和取消部署 Microsoft BizTalk 实体、运行数据库脚本以及创建、配置和删除网站。

快乐的脚本。

一个优秀的 Powershell 博客
http://pshscripts.blogspot.com/

维基百科页面
http://en.wikipedia.org/wiki/Windows_PowerShell

于 2009-07-08T08:53:03.773 回答
1

我研究过一个非常相似的应用程序,100 多个调用 OSQL 的 .cmd 文件。我们遇到了许多与您相同的问题,以及错误处理不当的问题。在我看来,与编写一个框架来在您的调度程序和批处理/脚本文件之间运行相比,获得一个可以执行您想要的操作的调度程序是一个更好的选择。在我看来,这种类型的系统需要一个老式的Job Scheduler。它调用您的可执行文件顺序、处理错误并传递您配置的参数。从ZenaJobScheduler有许多不同的选项。我建议选择一个具有良好 GUI 的。

于 2009-07-08T09:01:44.147 回答
0

如果我要替换批处理文件,我会使用一些 .NET 语言来完成。.NET 包含用于线程、启动应用程序和轻松处理输出的库。您当然可以使用 C# 作为脚本语言,甚至可以使用 PowerShell 或 Python。

于 2009-07-08T08:49:57.103 回答
0

你也可以试试 Quartz ( http://www.quartz-scheduler.org/ )。它是一个开源的、免费的 Java 调度工具,支持多种不同类型的任务,并且可以利用各种数据库。到目前为止,我已经将它与 DB2 一起使用。我们已经在生产中使用它超过 2 年了,它就像一个魅力。我们确实必须实现 java 服务包装程序,以便它作为服务运行,但这很容易实现。

于 2009-08-26T21:31:42.993 回答