![](http://img.e-com-net.com/image/product/0bc98502391f45fd99b3f8bba533e007.gif)
目录
假设您是上世纪 70 年代某个银行的 CEO。您的客户群正在快速增长,而继续采用纸质帐目无疑是一个既昂贵又具有风险的方法。有什么办法可以实现自动记帐吗?或者有什么更有效的存储办法吗?
结果表明,大多数这样的企业都在使用大型机或小型计算机,例如 AS/400 和 VAX 系统 — 而且很多程序员正是通过这些系统了解了自己的行业。面向商业的通用语言 (Common Business Oriented Language, COBOL) 最初开发于 1959 年,现在是这些系统上的主要开发语言。
了解到 COBOL 仍是用于企业应用程序的通用语言,您可能会感到惊讶。根据 2001 年 Gartner 有关企业编程语言采用情况的一份报告,调查的企业中有超过六成的企业仍在使用 COBOL。几乎所有主要行业都依赖于 COBOL。大多数对业务关键应用程序和数据存储使用大型机的公司都还在继续投资 COBOL 开发,甚至在从大型机迁移之后也还可能会这么做。直到 2006 年,纽约股票交易所才将其股票期权交换和记帐系统迁移至基于 Windows
® 的服务器,但是却以重新编译的形式继续运行其 COBOL 应用程序。
早期的大型机连接被限制为通过同轴电缆连接到控制器的终端,该控制器随之连接到前端处理器 (FEP),很像现在的网络。网络协议通常是 SNA(系统网络体系结构),不过大型机后来也开始支持 TCP/IP 了。线级连接的另一个常见选择是 IP-DLC 和高性能路由。SNA 的最初设计并不支持路由,因此需采用专门的路由硬件或软件将数据包传送给 FEP。由于许多 COBOL 应用程序特定于 SNA 协议,因此开发了 IP-DLC 作为备用,其中 IP 是主要的载体,而 SNA 在某种程度上被封装在其中。
在 SNA 内部有一些基于逻辑单元 (LU) 概念的子协议,逻辑单元是与网络交互的最终用户或应用程序。LU 0 用于自定义协议,LU 2 用于目标为基于终端的应用程序的 3270 数据流,LU 3 用于从大型机打印,而 LU 6.2 则用于应用程序到应用程序的通信。与 LU 2/3270(绿屏经常与大型机接口相关联)集成通常被称为屏幕抓取,在这里应用程序会遍历屏幕,查找固定位置中有用的数据。
在处理这些 LU 协议时,您通常会在利用现有的工具集和开发自己的自定义解决方案之间犹豫难决。考虑到后者的复杂性,这个选择就变得显而易见了。在任何一种情况下,您都必须开发或使用低级的网络处理程序,然后上移 OSI 栈以提供处理目标系统的特定要求所需要的其他逻辑,包括使用不同的代码页面进行字节转换、封包和拆包、会话连接、对话管理和安全性。这不是一件容易的事情。
适用于大型机的 BizTalk 适配器
适用于 Host Integration Server 的 BizTalk
® 适配器可帮助您连接至大型机和中型系统,并将 Windows 系统与其宿主应用程序、数据源、消息传递和安全性集成起来。例如,通过连接这些技术,驻留在大型机系统上的资源即变成了另一个 BizTalk 管理的终结点,可用作发送或接收位置。
在 Host Integration Server 2006 中,有四种主要的适配器:
- 适用于宿主应用程序的 BizTalk 适配器
- 适用于 WebSphere MQ 的 BizTalk 适配器
- 适用于主机文件的 BizTalk 适配器
- 适用于 DB2 的 BizTalk 适配器
Host Integration Server 除提供 BizTalk 适配器外,还提供了用于 TCP/IP、SNA 和 TN3270 的网络连接组件,为要到达主机的数据提供传输层。
适配器一旦安装就会注册,以便 BizTalk 可以找到它们,您也可以将它们添加到 BizTalk 管理控制台,如
图 1 所示。
图 1
管理控制台中的 BizTalk 适配器 (单击该图像获得较大视图)
除了适配器本身,也会安装所有适配器功能,以便与来自 Visual Studio
® 内部的大型机直接集成。对于数据访问,会安装 DB2 和主机文件 Microsoft
® .NET Framework 2.0 托管提供程序,并可通过编程形式或与 Visual Studio 中的 Server Explorer 集成来使用。另外,还提供了主机文件设计器 (Host File Designer) 和 DB2 数据访问向导 (DB2 Data Access Wizard),以便用户可以直接访问和设计主机文件。
除此之外,还提供了网络连接工具、事务集成程序和 Host Integration Server 项目以供您体验各种设计,同时还提供了可满足绝大多数受支持方案的示例代码以用来连接大型机和 AS/400 系统。甚至还为那些家中碰巧没有大型机的人士提供了主机模拟器 (Host Simulator)!
SimHost 可在安装文件夹中的 System 文件夹中找到。
实现连接
为了连接和选择正确的协议,您需要从大型机管理员那里获得合适的参数和安全凭据。例如,在连接到 DB2 数据库时,您会看到 TCP/IP 和 SNA (LU 6.2) 这两个选项。这些设置会应用到与大型机集成的所有层中。
当使用 TCP/IP 进行连接时,需要提供端口号,因为大型机会侦听该端口上的所有传入请求。SNA 配置需要大型机管理员进行更多输入,并且该连接必须使用 SNA Manager MMC 管理单元进行配置,如
图 2 所示。对于这两种配置,SDK 都提供了工作表以帮助您从大型机管理员那里收集需要的数据。
图 2
配置 SNA 连接 (单击该图像获得较大视图)
使用适用于主机数据的 BizTalk 适配器访问 DB2 数据库非常简单。通过使用适用于 DB2 的适配器,可以连接、读取或写入数据,并根据 DB2 执行常见的 SQL 命令。Host Integration Server 通过提供数据访问向导 (Data Access Wizard) 来进行测试,进一步简化了这个功能。
除 BizTalk 适配器的功能外,DB2 适配器还提供了用于 DB2 的 .NET Framework 数据提供程序,它可用来直接访问 DB2 数据库服务器中的信息。DB2 的数据提供程序基于 DB2 的 Microsoft 网络客户端,提供了组合、架构生成、事务处理和静态 SQL 等功能。
当您连接到数据库后,BizTalk 端口传输属性会包含连接 BizTalk 运行时所需要的字符串。
安装了用于 DB2 的主机适配器以及 .NET Framework 托管提供程序后,您也可以用编程方式访问主机上的 DB2 数据,如
图 3 演示的代码所示。此外,针对 TCP/IP 和 SNA 协议提供了调试和跟踪工具。
![](http://img.e-com-net.com/image/product/0bc98502391f45fd99b3f8bba533e007.gif)
Figure 3 访问 DB2 数据库
using Microsoft.HostIntegration.MsDb2Client;
[WebMethod(TransactionOption=TransactionOption.RequiresNew)]
public DataSet GetAccountsFromDB2(string connString)
{
MsDb2Connection conn = new MsDb2Connection(connString);
MsDb2DataAdapter da = new MsDb2DataAdapter();
DataSet ds = new DataSet();
try
{
conn.ConnectionPooling = false;
conn.Open();
da.SelectCommand = new MsDb2Command();
da.SelectCommand.Connection = conn;
da.SelectCommand.CommandText = "SELECT * FROM MSDB2BANK";
da.Fill(ds);
ContextUtil.SetComplete();
}
catch(Exception e)
{
ContextUtil.SetAbort();
throw e;
}
finally
{
conn.Close();
}
return ds;
}
公开 COBOL 应用程序作为终结点
适用于宿主应用程序的 BizTalk 适配器基于事务集成器 (TI),以前称为 COM 事务发起程序 (COMTI)。该适配器扩展了 TI 技术,以提供 COBOL 应用程序和事务作为 BizTalk 和 .NET 客户端管理和使用的终结点。
在深入研究适用于宿主应用程序的 BizTalk 适配器之前,您需要了解在设计和运行时环境中,编程模型如何影响您在主机上调用任何 COBOL 事务的方式。如之前所述,实现连接非常重要,它在确定您可使用哪个编程模型从 BizTalk 和所有 .NET 应用程序调用 COBOL 应用程序方面具有重要作用。
选择编程模型的目的是为了确定如何与大型机进行交互。适用于宿主应用程序的 BizTalk 适配器没有在主机上安装任何组件,因此您需要找出与大型机应用程序集成的主机端信息。
如果选择使用 TCP/IP 进行连接,您有两种选择。第一种是 MSLink 模型,其中侦听器应用程序位于主机上。该侦听器会截取入站呼叫,并将它们调度给相应的 COBOL 应用程序,如
图 4 所示。
尽管该图看起来令人生畏,但是它显示的这些概念并不复杂。使其简化的最好办法就是借用一个类似的过程。如果将 IIS 看作一个示例,那么该图中启动时加载的侦听器块在绑定到网络适配器后即代表 TCP/IP 堆栈。一旦加载了 IP 堆栈,IIS 就会被配置为通过端口列表与它通信。在
图 4 中,它可能是并发服务器。显然,在 IIS 中,最常见的端口是端口 80;在大型机领域中最常见的端口则是 3000 和更高的端口。
图 4
通过 MSLink 侦听器实现的宿主应用程序集成
服务器事务处理程序 (TP) 稍微复杂一些,但简单来说,可以想一下 ASP.NET HTTP ISAPI 扩展。当 IIS 接收到 ASPX 或 ASMX 文件类型的页面请求时,它会将该请求移交给 IIS 扩展。然后,该扩展使用 ASP.NET 运行时来处理入站请求,处理对客户端的响应,等等。
在 MSLink 模型中,有三个基本组件。第一个是侦听器,它由 IBM 提供并用于 TCP/IP 端口和套接字管理。一旦该侦听器接收到了来自 .NET 客户端的传入请求,它就会接受该连接,指示 .NET 客户端发送数据事务处理请求消息 (TRM),并启动并发服务器。
第二个是并发服务器,它负责处理来自 .NET 客户端的传入请求,分析这些请求,将 .NET 客户端想调用的事务解压缩,并生成实际的调用。它还让该连接保持打开状态,等待服务器 TP 响应。一旦返回就会关闭该套接字。
最后,服务器 TP 执行客户端实际想要调用的最终事务。TP 接收数据,调用 COBOL 逻辑,然后将结果返回给并发服务器,随之并发服务器将它发回到 .NET 调用方。
并发服务器包含所有特定于 TCP 套接字的代码。实际上,Microsoft 在 SDK 中为客户提供了示例侦听器 MSCMTICS.CBL 作为指导。假设 COBOL 应用程序是可调用的(例如,它们没有屏幕输出),那么使用 MSLink 侦听器是首选方法,因为它不需要对可调用的 COBOL 应用程序做其他更改。
TCP/IP 连接的第二种方法是 User Data 模型,其中每个可调用的 COBOL 应用程序都包含 TCP 套接字代码,并且可直接从您的 .NET 代码内部进行调用,如
图 5 所示。
图 5
通过 User Data 和 .NET 实现的主机集成
基于 MSLink 示例,同时也为了在类比中保持一致,我将沿用 IIS 的说法。与
图 4 中含有三个步骤的 MSLink 过程相比,User Data 模型组合了第二步和第三步。这类似于开发自己的 IIS 服务器或 Windows Communication Foundation (WCF) 通道来侦听端口,选取并处理入站请求,然后将回调返回给客户端,所有这一切都发生在同一个运行进程中。在 User Data 模型中,并发服务器和用户想调用的最终事务都位于大型机上的一个 TP 内。
值得注意的是两者之间的区别:MSLink 模型没有那么强的侵入性,因为不必对调用的事务执行任何操作,并且所有的 TCP 套接字代码都是在通用侦听器中处理的。将它与 User Data 模型相比,后者则要求在客户端想要调用的每个事务中都显示套接字代码。另一个值得注意的特征是,在 MSLink 模型中,最终事务是以非拦截方式调用的;而在 User Data 模型中,整个过程是以单个迭代的方式执行的。
如果使用的是 SNA 或 IP-DLC 连接方法,则这些编程模型仍然适用,但不需要侦听器应用程序,因为默认情况下大型机提供了名为 CSMI(可以使用其他名称)的本机事务作为侦听器。此事务会使用在调用客户端和用户希望调用的最终事务之间充当网关的分布式程序链接 (DPL),如
图 6 所示。使用 DPL,则无需在大型机上安装任何软件,因此这种方法比基于 SNA 的非 DPL 事务通信更具优势。利用 DPL,.NET 客户端看起来就像调用 CICS TP 的其他大型机。
图 6
不使用侦听器的主机集成
选择 CICS 链接后,.NET 客户端便会发送请求;然后镜像事务或 CSMI 会控制入站请求,并在调用它后将 COMMAREA 传递给 TP。一旦调用和处理了业务逻辑,CSMI 便会将数据返回给客户端。
一旦确定了编程模型,则可以开始公开 COBOL 应用程序作为终结点和 .NET 程序集。为此,您可能需要来自大型机开发人员的 COBOL Copybook。Copybook 类似于 C++ 结构定义,因为它定义了 COBOL 应用程序预期的输入和输出数据。COBOL Copybook 通过 Import COBOL 向导导入 Visual Studio(请参见
图 7)。
图 7
导入 COBOL Copybook (单击该图像获得较大视图)
导入成功后,会生成一个 .NET 程序集,您可以选择类型限制 Web 服务、无或适用于宿主应用程序的 BizTalk 适配器。选择后者会生成将其添加到 BizTalk 项目和在 BizTalk 管理的任何业务流程中利用 COBOL 事务所需的所有项目。
完成此步骤后,您将需要部署 .NET 程序集,并向适配器提供调用 COBOL 应用程序所需的元数据。这些元数据描述了远程环境 (RE),也称作大型机。RE 可通过使用适用于宿主应用程序 TI Manager MMC 管理单元的 BizTalk 适配器进行配置。
配置好 RE 之后,.NET 程序集便可与目标 RE 关联起来。您现在还可以使用端口参数来定义 RE。
到目前为止,您已了解了如何从 .NET 内部将 COBOL 应用程序或事务作为 BizTalk 终结点公开。导入的 COBOL Copybook 公开了数据,RE 提供了到执行业务逻辑的大型机的接口。为将该业务逻辑移至 Windows 平台,供应商(如 Micro Focus 和 Fujitsu)提供了 CLR 兼容的 COBOL .NET 编译器和 Visual Studio 插件以导入 COBOL 代码并在 Windows 上本机运行它。这些工具甚至可以再进一步,例如将 COBOL 代码转换成 C#。
不使用适配器的集成
另外两个重要的集成功能不是以适配器的形式提供的,但是它们可以作为终结点提供给 BizTalk:主机初始化处理 (HIP) 和会话集成器。
HIP 允许大型机的 COBOL 应用程序调用位于 Windows Server
® 平台上的所有 .NET 程序集,以参与任何 BizTalk 业务流程。HIP 将设计时工具与 Visual Studio 集成,它使用 TI MMC 管理单元来管理承载 HIP 侦听器所需的元数据,以及确保终结点安全所需的安全策略。通信传输遵循的准则与之前强调的准则一样,Microsoft 提供了示例 COBOL 代码以测试 HIP 连接性和功能。
会话集成器提供了一组 .NET 对象,这些对象允许您对 COBOL 终端应用程序执行屏幕抓取。它是一种基于服务器的技术,如果您正尝试集成的 COBOL 应用程序不可调用,它会非常有用,可直接写入具有未与业务逻辑隔离的 UI 的屏幕。
图 8 显示了示例屏幕抓取应用程序的外观。这些数据可通过 .NET 对象公开,它可将屏幕画布转换成您可从中读取数据或写入数据的行和列。
图 8
基于会话集成器的屏幕抓取应用程序 (单击该图像获得较大视图)
结束语
Microsoft 提供的适用于 Host Integration Server 的 BizTalk 适配器不仅可以实现互操作性,而且还可以与大型机和 AS/400 旧式系统集成。通过该适配器,可以使用和公开 COBOL、DB2 和其他大型机资源作为 BizTalk 终结点。您可以看到,使用这些适配器与采用自己的集成组件相比要简单得多,因为旧式大型机环境非常复杂。此外,这些适配器不需要占用主机上的任何资源,这对面临持续缺乏技术人员来开发和管理宿主应用程序的 IT 部门来说非常具有吸引力。
有关旧式主机集成问题的详细信息,请参阅 TechNet Host Integration Server 技术中心,网址是:
technet.microsoft.com/his。在那里您会找到各种资源,包括信息白皮书“Introduction to BizTalk Adapters for Host Systems”(适用于主机系统的 BizTalk 适配器简介)(
technet.microsoft.com/library/bb726925.aspx)。
Bashar "Bash" Badawi在开发基于 Microsoft 的解决方案以及咨询方面拥有 20 年的 IT 经验。Bash 目前是在现场帮助客户和合作伙伴了解及实现企业解决方案的 BizTalk/Host Integration Server 小组的高级项目经理。