我最近为正在进行研究项目的一位优秀 Java™ 开发人员提供过咨询服务。“Jane”需要在最后期限内为 WebSphere ESB 和 WebSphere Process Server 构建应用程序。尽管她并不熟悉 WebSphere Integration Developer,但对 Java 和其他开发环境相当熟悉,非常自信能够使用 WebSphere Integration Developer 在期限内完成给定的任务,并愿意在此过程中学习所需的有关这个新集成开发环境的任何知识。但在未能成功完成数个项目的构建后,她向我寻求帮助。我粗略估算了一下,她花费了五倍于她这个技能层次的人应该花费的时间来完成此开发工作。问题在哪里呢?是产品的问题,还是安装产品的方式的问题?是 Jane 的问题,还是因为她无法应用她以前的经验而造成的?
简单来说,Jane 遇到了一系列之前我的客户和同事无数次遇到的那些常见问题。解决了这些问题后,Jane 不仅会因此而轻松一大截,还能够更为高效地开展工作。现在她能快速进行调试、成功构建项目,而且她的集成测试环境运行更为平稳了。
因此,我希望能籍此和您分享一些使用 WebSphere Integration Developer 时应该知道的一些技巧,这些技巧或许也能提高您的开发工作质量。简单说来,我的技巧如下:
- 修改安装路径
- 检查产品更新
- 采用代码版本控制
- 使用 Dependency Editor 添加库
- 确保服务器干净地启动
- 检查管理控制台获得已安装项目
- 从测试组件向导删除模拟器
- 熟悉组件的 XML 表示形式
以下是有关各个技巧的详细信息。
Windows® 路径长度限制为 259 个字符。如果 WebSphere Integration Developer 安装在 Program Files 下,就可能出现类似于以下所示的错误:
清单 1. URI 长度错误
[7/23/06 16:59:14:500 EDT] 0000009f WorkSpaceMast E The URI length is greater than the Windows limit of 259 characters. Unable to create or update file: C:\Program Files\IBM\WebSphere\ID\6.0\pf\wps\wstemp\10c9d2da4bb\ workspace\cells\widCell\applications\inEnergyProcessApp.ear\deployments\ inEnergyProcessApp\inEnergyProcessEJB.jar\META-INF\wsdl\com\ibm\extremeblue\ inenergy\process\outageprocess\OutageProcess.wsdl |
其解决办法是使用更短的安装路径(如 C:\WID),而不要在安装路径中使用完整的产品名称。作为一种临时的补救措施,还可以使用更短的业务集成模块名称,而 Jane 最初解决这个问题也是采用这种方法(图 1)。
图 1. 更短的安装路径
实际上,我对此的强调可能还不足以说明其重要性。这个技巧是最基本的,但也是非常必要的。我遇到了无数由于开发环境未应用修补程序而导致出现问题的情况。事实上,WebSphere Integration Developer 是我们最新的业务集成开发环境,因此会频繁推出新的更新程序。本文发表时,最新的 WebSphere Integration Developer 版本为带 Interim Fix 9 的 V6.0.1.1。打开此产品时,可以检查更新,请选择 Help => Welcome => IBM Rational Product Updater(图 2)。
图 2. WebSphere Integration Developer 产品更新菜单
同样重要的是,需要对集成测试服务器 (WebSphere Process Server) 应用修补程序;此过程与 WebSphere Integration Developer 更新过程是分开的。为了确定服务器版本,请使用浏览器打开管理控制台,其缺省地址为 http://localhost:9060/admin by default。初始屏幕上会显示版本号。本文发表时,WebSphere Process Server 的最新版本是 6.0.1.2(图 3)。
图 3. 确定 WebSphere Process Server 版本
如果需要,可以从 WebSphere 支持站点下载 WebSphere Process Server 和 WebSphere ESB 修补程序(请参见参考资料)。
Jane 没有源代码控制,而这极大地影响了她的效率。WebSphere Integration Developer 提供了 CVS 视图,便于您快速设置源代码控制。这最终将为您节约大量时间,即使仅在 WebSphere Integration Developer 的同一台计算机上设置 CVS 存储库时也是如此。例如,如果在程序集中发现错误,通过恰当的版本控制功能,您可以回溯以前的版本,以确定此错误是何时出现的。
对于 Jane 的较小的项目,我们使用了项目交换功能来定期备份她的工作区。项目交换文件是一个 ZIP 文件,可备份工作区内任意数量的项目。可以通过选择 File => Export.. => Project Interchange 创建项目交换文件。(图 4)
图 4. 项目交换导出
我建议在构建了每个 SCA 组件后创建一个项目交换文件或新源代码控制版本。请确保为交换 ZIP 文件使用了描述性文件名。例如,我喜欢按日期对其进行命名。
使用 WebSphere Integration Developer 库是一个很好的想法,可以通过这样重用业务对象和 WSDL 接口。我遇到过很多与库有关的问题,会产生与以下所示类似的错误:
清单 2. 与库相关的错误
CWSCA8025E: The WSDL PortType defined in the interface is invalid. CWSCA8011E: Operation checkCredit cannot be resolved. |
以上错误指示无法找到 WSDL 接口。导致这种情况的一个常见原因是未为模块定义库依赖关系。应该通过右键单击模块并选择 Dependency Editor 来添加库(图 5)。
图 5. Library Dependency Editor
Jane 让我帮忙解释对 WebSphere Integration Developer 程序集调用组件测试向导时遇到的一个异常。堆栈跟踪记录中不包含她工作区中的任何代码,这个异常是业务流程容器发出的运行时异常。我看到这种类型的错误时,经常会对 WebSphere Process Server 测试服务器本身进行检查,以确定已对其应用了修补程序,且运行正常。完全可以肯定,当我查看服务器启动日志(重新启动服务器时,会自动显示在 WebSphere Integration Developer 控制台上)时,会发现其中包含一些 SIBus 错误。测试应用程序而遇到 WebSphere Process Server 或 ESB 运行时错误时,请重新启动服务器,并确保它是干净地启动的。务必对应用程序的问题与服务器运行时问题加以区分。测试环境运行时,应该看到类似于“Server server1 open for e-business”的消息。(图 6)
图 6. 正常的服务器启动
我认为 Jane 遇到的问题和一个 SIBus 异常紧密相关。WebSphere Integration Developer 业务集成应用程序大量使用了 WebSphere Application Server SIBus(系统集成总线)的功能。她的问题的根源在于,她在测试服务器和 SIBus 目的地(或 WebSphere Process Server 和 ESB 程序集使用的管道)上安装了相同应用程序的太多版本,而这些版本之间出现了冲突。
这个问题之所以让 Jane 感到恼火,是因为她甚至不知道在 Servlet 上部署了多个应用程序!基于 Eclipse 的开发环境中的服务器视图仅显示在服务器上已部署的当前工作区内的项目(图 7)。
图 7. WebSphere Integration Developer 中已部署应用程序的服务器视图
在尝试开发首批 WebSphere Integration Developer 应用程序时,Jane 使用了数十个工作区。这样的做法通常都不错;我经常会为每个项目创建全新的工作区。处理调试问题时,Jane 会创建一个新工作区,然后采用不同的方式进行尝试。每次她都将前一个工作区的模块保留部署在服务器上。
确定在测试环境中部署了什么内容的最佳方式是使用 WebSphere Application Server 管理控制台,可以使用 Web 浏览器通过缺省地址对其进行访问:http://localhost:9060/admin(图 8)。
图 8. 管理控制台中的 Enterprise applications 页
如图 8 中所示,可以通过选择 Applications => Enterprise Applications 查看已部署的企业应用程序。使用 Uninstall 按钮可删除冗余模块或旧模块。
重要:不要删除运行时相关的企业模块,如 BPEContainer。图 8 显示了在集成测试服务器上安装的缺省应用程序。您的应用程序也将显示在此列表中。强烈建议不要删除其中的任何缺省应用程序。
删除了 Jane 的多个不需要的应用程序后,服务器就可干净地启动,而不再有任何 SIBus 冲突。
解决了问题后,Jane 非常高兴,开始继续测试自己的程序集——但随后发生了一件奇怪的事情。她的测试未返回错误,但似乎也没有执行任何操作。我立即询问她是否知道测试组件向导的模拟器功能。(图 9)
图 9. 从测试组件向导删除模拟器
请看图 9,其中显示了测试组件向导的 Configurations 选项卡。缺省情况下,WebSphere Integration Developer 将仅对您通过单击右键选择测试的组件进行单元测试,并会模拟 其他组件的行为:从与下游组件关联的接口获取存根,并返回缺省值。我遇到很多客户说测试组件向导完全崩溃了,而这些客户都有一个错误的想法,即假定该向导将对程序集中的所有组件进行单元测试。
Jane 希望测试其程序集中的所有组件,因此我们删除了所有模拟器。接下来会怎样呢?成功了!BPEL 组件对其他 SCA 组件进行编排,并返回了她所预期的结果。
如果您真的希望通过 WebSphere Integration Developer 提高效率,最值得投入时间的事情是注意 WSDL 接口、业务流程组件和业务项目的基础 XML 表示形式。所有这些组件都使用业务对象的 XML 模式定义(XML Schema Definitions,XSD)、业务流程的业务流程执行语言(Business Process Execution Language,BPEL)和接口的 Web 服务描述语言(Web Services Description Language,WSDL)等 XML 标准。
为了说明为什么这会有所帮助,请考虑以下错误:
清单 3. WebSphere Integration Developer 接口问题
cvc-attribute.3: The value 'myObject:Report' of attribute 'type' on element 'xsd:element' is not valid with respect to its type, 'QName'. |
为了解决这个问题,您的第一个反映可能是确定工作区中的哪个文件导致了错误。这在 Eclipse IDE 中通常相当明显,因为会用小叉标记出错误的位置。在本例中,出问题的是一个名为 SimpleInterface 的接口。双击文件后,就会打开接口编辑器,如图 10 中所示。
图 10. 接口编辑器
正如所您看到的,接口编辑器并没有提供调试问题的方法。为了真正了解其根源,您需要查看接口的基础 XML 表示形式,即一个 *.wsdl XML 文档。通过右键单击接口,并选择 Open With => XML Source Page Editor,可以对 XML 进行编辑。SimpleInterface.wsdl 的内容如下所示:
清单 4. SimpleInterface.wsdl
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions xmlns:myObjects="http://MyLibrary/MyBusinessObjects" [1]
xmlns:tns="http://MyLibrary/SimpleInterface" xmlns:wsdl="http://schemas.xmlsoap.org/wsdl/"
xmlns:xsd="http://www.w3.org/2001/XMLSchema" name="SimpleInterface"
targetNamespace="http://MyLibrary/SimpleInterface">
<wsdl:types>
<xsd:schema targetNamespace="http://MyLibrary/SimpleInterface"
xmlns:bons1="http://MyLibrary"
xmlns:tns="http://MyLibrary/SimpleInterface"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:import namespace="http://MyLibrary/MyBusinessObjects"
schemaLocation="Report.xsd"/>
<xsd:element name="checkCredit">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="code" nillable="true" type="xsd:string"/>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
<xsd:element name="checkCreditResponse">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="report" nillable="true" type="myObject:Report"/> [2]
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
</wsdl:types>
<wsdl:message name="checkCreditRequestMsg">
<wsdl:part element="tns:checkCredit" name="checkCreditParameters"/>
</wsdl:message>
<wsdl:message name="checkCreditResponseMsg">
<wsdl:part element="tns:checkCreditResponse" name="checkCreditResult"/>
</wsdl:message>
<wsdl:portType name="SimpleInterface">
<wsdl:operation name="checkCredit">
<wsdl:input message="tns:checkCreditRequestMsg" name="checkCreditRequest"/>
<wsdl:output message="tns:checkCreditResponseMsg" name="checkCreditResponse"/>
</wsdl:operation>
</wsdl:portType>
</wsdl:definitions>
|
由于清单 3 中的错误提到了“myObject:Report”,因此可立即定位到标记为 [2] 的代码行。Report 是一种复杂 XML Schema 类型,在另一个文件中定义(可能名为 Resport.xsd)。为了引用外部复杂类型,将使用命名空间标识符。在标记为 [2] 的代码行,其命名空间标识符为 myObject。不过,如果查看标记为 [1] 的代码行,会发现声明 myObjects 时使用了一个额外的字符“s”。对二者中的任意一个进行修改,使其保持一致,即可消除此错误。
正如您所看到的,如果不查看 *.wsdl 文件,调试上述问题可能会要求完全重新创建相应的 SCA 接口组件。通过查看基础 XML 表示形式,可更为高效地修复此问题。WebSphere Process Server 和 ESB 运行时可识别 WebSphere Integration Developer 内构建的组件的基础 XML 文件。事实上,可以将基础 XML 文件视为运行时执行的指令。与尝试在 WebSphere Integration Developer 的图形级别进行调试相比,如果可以在 XML 级别调试问题,则要高效得多。
我们都处于 Jane 的位置。几乎很少有 IT 从业人员花时间通过阅读最新的红皮书、产品指南和信息中心文档来了解如何利用开发工具获得最高的效率。另外,自己动手实践通常也会有意思得多。希望本文中提供的信息能帮助您快速而安全地实现高效率。
- 您可以参阅本文在 developerWorks 全球站点上的 英文原文 。
- WebSphere Software Support
- WebSphere Integration Developer 产品信息
- WebSphere Process Server 产品信息
- WebSphere ESB 产品信息
- developerWorks WebSphere
- Patterns: Building Serial and Parallel Processes for IBM WebSphere Process Server V6
- WebSphere Process Server and WebSphere Integration Developer resources

Robert R. Peterson 是 IBM WebSphere 软件服务部支持团队的成员。他的工作是确保 WebSphere 系列产品能为 IBM 的客户带来尽可能大的价值。Robert 是一位颇有成就的发明家,也是 WebSphere Application Server V6: Performance and Scalability 的作者之一。他是著名的 IBM 天才孵化计划的前成员之一,拥有佛罗里达大学的计算机工程硕士学位。