FeaturesPluginsDocs & SupportCommunityPartners

BPEL 设计器开发者指南:疑难解答


目录

BPEL 设计器开发者指南

服务端点冲突

在部署复合应用程序时,系统将尝试为部署的流程定义一个或多个服务端点。每个服务端点必须是唯一的。因此,如果尝试部署两个具有相同服务端点定义的流程,系统会将这种情况标记为错误,并且无法成功完成部署。此时,将显示类似于以下内容的消息:

Deploy service assembly failed. (partial success)
MESSAGE: (SOAPBC_DEPLOY_2) Failed to deploy: java.lang.Exception:
An activated endpoint already has the same SOAP Address location:
http://localhost:18181/SynchronousSample
C:\<...>\SynchronousSample1Application\nbproject\build-impl.xml:209:
Service assembly deployment failed.
BUILD FAILED (total time: 31 seconds)

如果看到这种类型的消息,则表示发生服务端点冲突。通常,这可能是由于以下原因所造成的:您尝试部署的流程几乎相同,只是这些流程被打包在不同的复合应用程序项目中。例如,如果您多次调用“新建项目”>“样例”>“同步 BPEL 流程”(或任何其他样例),就会出现这种情况。您将获得多个 BPEL 模块以及多个复合应用程序项目。例如,如果使用缺省路径两次,您将获得四个项目:

  • SynchronousSample
    SynchronousSampleApplication
  • SynchronousSample1
    SynchronousSample1Application

它们是完全不同的复合应用程序和完全不同的 BPEL 流程,但在缺省情况下,会在其 SynchronousSample.wsdl 文件中定义相同的端点地址。它们都将包含以下端点地址:

<service name="service1">
   <port name="port1" binding="tns:binding1">
      <documentation/>
      <soap:address location="http://localhost:18181/SynchronousSample"/>
   </port>
</service>

如果尝试部署两个具有相同服务端点的复合应用程序(SynchronousSampleApplication 和 SynchronousSample1Application),则第二个复合应用程序的部署过程会由于发生端点冲突而失败。

当您希望对其中的一个或两个流程进行修改并同时部署它们时,就需要部署复合应用程序的多个版本。您这样做的目的可能是希望并排比较它们的行为。您可以这样做,但必须为其设置不同的端点地址。这意味着,应编辑流程 wsdl 文件并调整 "soap:address location" 属性以使其不会发生冲突。您可以调整端口号或服务名称。例如,以下任何一项调整都会使其与原始属性完全不同:

<soap:address location="http://localhost:18182/SynchronousSample"/>

或者

<soap:address location="http://localhost:18181/SynchronousSampleNew"/>

取消激活端点

当 BPEL 引擎发生端点冲突时,它会主动取消激活发生冲突的端点。出现这种情况后,将在服务器日志中显示以下消息:

java.lang.RuntimeException: javax.jbi.messaging.MessagingException: Endpoint has been deactivated.
at com.sun.jbi.engine.bpel.EngineChannel.reply(EngineChannel.java:227)

最初,您可能不会注意到此消息,但此问题的症状是后续测试运行将会失败。当您发现这种情况时,请确保解决冲突并重新部署复合应用程序。然后,就一切正常了。

服务端点与测试用例之间的关系

当您调用测试操作时,复合应用程序中的每个测试用例都将尝试向目标流程发送输入消息。每个测试用例都包含一个名为 "destination" 的属性,以了解将消息发送到的位置。您可以在“属性”窗口中修改此属性;要调用此窗口,请右键单击测试用例节点,然后从弹出式窗口中选择“属性”。

destination=http://localhost:18181/SynchronousSample

"destination" 属性的值是在创建测试用例时设置的。因此,如果以后更改了服务端点,则需要手动为以前生成的所有测试用例调整 "destination" 属性。当然,新生成的测试用例将会正常工作。

端口

Sun Java System Application Server HTTP 端口

缺省情况下,Enterprise Pack 安装程序会尝试将应用服务器的 HTTP 端口配置为 8080。某些样例流程使用的就是值 8080。如果由于某种原因,应用服务器的 HTTP 端口不是 8080,则必须对样例进行调整。

尤其值得说明的是,需要对旅行预订服务样例进行一些调整。

例如,假定应用服务器正在 HTTP 端口 8090 上(而不是在缺省 8080 上)进行侦听。在这种情况下,您必须执行以下操作:

调整预订合作伙伴服务 WSDL 文件

  1. 在 TravelReservationService BPEL 模块中,将
    AirlineReservationService.wsdl 中的 soap 地址值由
    <soap:address
    location="http://localhost:8080/webservice/AirlineReservationService"/>

    更改为
    <soap:address
    location="http://localhost:8090/webservice/AirlineReservationService"/>
  2. 类似地,更新 VehicleReservationService.wsdl
    HotelReservationService.wsdl 中的 soap 地址值

注意:要了解应用服务器正在侦听的 HTTP 端口,请打开“运行环境”窗口,右键单击 "Sun Java System Application Server 9" 节点,然后选择“查看管理控制台”。这将在浏览器中打开 Sun Java System Application Server 管理控制台。键入用户名和口令(缺省值为 admin/adminadmin),然后登录。在左窗格中单击 "Application Server",然后在右窗格中选择“常规”标签。所需的 HTTP 端口值是“HTTP 端口:”行中的第一个值。
或者,请在应用服务器日志中找到以下行:

WEB0712: Starting Sun-Java-System/Application-Server HTTP/1.1 on 8080
WEB0712: Starting Sun-Java-System/Application-Server HTTP/1.1 on 8181
WEB0712: Starting Sun-Java-System/Application-Server HTTP/1.1 on 4848

所需的值位于第一行中。

旅行预订服务端点冲突

有关此问题的常规描述,请参见上面的服务端点冲突部分。但对于旅行预订服务样例,您还必须执行一些额外的步骤:

如果端口 18181 不可用,并且需要在另一个端口(如端口 19191)上运行 TRS,请按照下面的一组步骤进行操作:

更改 URL

打开 TravelReservationService.wsdl

service 标记中,将
soap:address location="http://localhost:18181/TravelReservation/buildItinerary"/
更改为
soap:address location="http://localhost:19191/TravelReservation/buildItinerary"/

类似地,更新 airlineReserved、hotelReserved 和 vehicleReserved 的 URL。

调整合作伙伴 EJB 项目 ReservationPartnerServices

请执行以下步骤:

  1. 在 IDE 中,打开 ReservationPartnerServices 项目。
    (IDE 在您创建 TravelReservationService 项目的位置创建了 ReservationPartnerServices 项目。)
  2. 在“项目”窗口中,依次展开 "ReservationPartnerServices" 项目节点和“配置文件”节点,然后双击 "ejb-jar.xml" 节点以在 ejb-jar.xml 可视编辑器中打开该文件。
  3. 在编辑器中的 "Enterprise Bean" 下面,单击 "ReservationCallBackProviderMDB" 以展开该条目。展开“Bean 环境”,然后展开“环境条目”。
  4. 在“环境条目”下面,选择每个条目,然后单击“编辑”以更改“条目值”字段中的 18181 端口号。
    例如,对于 AirlineCallbackURL,将
    http://localhost:18181/TravelReservation/airlineReserved
    更改为
    http://localhost:19191/TravelReservation/airlineReserved

更新“目标”属性

  1. TravelReservationServiceApplication 复合项目中:
  2. 展开“测试”节点,对于它下面的每个测试用例节点:
    1. 右键单击测试用例节点,然后选择“属性”。
    2. 在“属性”窗口中,更新“目标”属性的值。
      示例:
      http://localhost:18181/TravelReservation/buildItinerary
      更改为
      http://localhost:19191/TravelReservation/buildItinerary

测试运行

在执行测试用例时:

  • 如果 Output.xml 文件是空的(创建新的测试用例后,该文件是空的),系统会询问您是否应使用第一次测试运行的响应来填充该 Output.xml。第一次测试运行的输出将指示测试运行失败。
  • 如果 Output.xml 文件不是空的,则会将获取的结果与该文件的内容进行比较;如果它们匹配,则将测试执行标记为通过。

测试运行失败

如果测试运行失败,您可以执行以下一项或两项操作:

  • 在测试运行失败后检查响应消息。您可以在“项目”窗口中的测试用例节点下面找到响应消息。响应消息包含时间戳。
    您可以验证该响应是否与预期响应(即 Output.xml)相匹配,这可能有助于您了解出现的问题。
  • 在测试运行失败后检查服务器日志文件。
    要执行此操作,请转至 IDE 的“运行环境”标签。右键单击 "Sun Java System Application Server" 节点,然后选择“查看服务器日志”操作。
    这将显示服务器日志的内容,其中可能包含有关为何测试运行失败的信息。

一种特定的测试运行失败情况与使用 Input.xml 中嵌入的基于内容的关联进行测试有关(例如,旅行预订服务测试用例中的 Input.xml 文件将 <UniqueID>...</UniqueID> 作为关联基础)。在这种情况下,如果正在运行由测试用例启动的一个流程实例,同时又要运行相同的测试用例,则不会启动第二个流程实例,因此测试将失败。Sun Java System Application Server 日志中将显示以下消息:

Exception occured while executing a business process instance.
com.sun.jbi.engine.bpel.core.bpel.exception.CorrelationAlreadyExists: An instance is associated with the correlation
<...>

在使用服务器时禁用防火墙

要在应用服务器上成功部署、运行、调试或测试应用程序,或者在 BPEL 服务器上成功部署、运行、调试或测试业务流程,您必须禁用任何防火墙。

修改 XSD 和 WSDL 文件

问题 81190

修改 XSD 和 WSDL 文件时,不能自动启动 BPEL 验证。仅当引入对 BPEL 文件的更改或者对 BPEL 项目执行生成或部署操作时,才会调用 BPEL 验证。您也可以通过单击“设计”视图或“源”视图工具栏中的“验证 XML”按钮 (Alt+Shift+F9) 来手动调用 BPEL 验证。有关详细信息,请参见验证部分。

问题 86274

如果 XSD 或 WSDL 文件的格式不正确,请解决此问题。但请注意,在重新打开 BPEL 文件之前,BPEL 文件不会反映对 XSD 和 WSDL 文件所做的更改。

验证系统不检测所需的关联集使用实例

BPEL 服务引擎要求在使用关联集时严格遵循相应的规范。目前,验证系统不检测违反以下要求的情况:

  • 活动消息:如果在不包含 createInstance="yes" 属性的 Pick 活动中使用活动消息,则活动消息元素必须具有有效的 <correlations> 子元素。
  • 接收:如果接收元素不包含 createInstance="yes" 属性,则该元素必须具有有效的 <correlations> 子元素。
  • 活动事件:活动事件元素必须具有有效的 <correlations> 子元素。

更改合作伙伴服务

问题 86499

如果合作伙伴服务的接口已更改(例如,当 Web 服务操作的签名发生更改时)并且您尚未导入修改后的 WSDL 文件,则 BPEL 流程将挂起。您必须导入新的 WSDL 文件并重新部署应用程序。此外,您还必须重新启动 BPEL 服务引擎。

从“导航”的关联集中删除属性时导致错误地从 WSDL 中删除该属性

问题 87221

如果使用“导航”中的弹出式菜单命令从关联集中删除属性,则会错误地从 WSDL 文件中删除该属性。解决方法是:使用关联集编辑器,而不是使用属性节点本身上的“删除”弹出式菜单操作。

取消合作伙伴链接对话框

如果将 WSDL 文件或 Web 服务节点从 NetBeans 项目拖到 BPEL 模块图上,将会产生一些影响。这些影响包括自动“检索”拖动的源对象的 WSDL 文件。如果取消在将 WSDL 文件或 Web 服务节点拖到图上时显示的合作伙伴链接对话框,IDE 将不会对 WSDL 文件执行回滚检索。如果项目不需要这些文件,只需从“项目”窗口中手动将其删除,如同删除任何其他项目资源一样。

“撤消”和“重做”命令

问题 84793

当“导航”窗口具有焦点时,无法使用“撤消”和“重做”命令。要访问“撤消”和“重做”命令,请将焦点放在图中。您将能够撤消和重做在“导航”窗口中启用的更改。

调试

在调试的同时添加断点

问题 82497

如果具有活动调试会话,则只能将断点添加到活动调试会话的语言中。例如,如果具有活动 BPEL 调试会话,则无法在 java 代码中添加断点,反之亦然。解决方法是:将与要添加断点的语言相关的调试会话转变为活动会话。或者,要添加断点,请关闭所有调试会话。

BPEL 调试器控制台消息

您会在 BPEL 调试器控制台中看到以下消息:

Connecting to <host>:<port>
调试器正在尝试连接 BPEL 服务引擎。
Debug session started
调试器已成功连接 BPEL 服务引擎,并且调试会话已启动。
Unable to start a debug session : Unable to connect to <host>:<port> : Connection timed out: connect
如果看到此消息,请确保:
  • Sun Java System Application Server 正在运行。
  • BPEL 服务引擎已启动。
  • BPEL 服务引擎的 DebugEnabled 属性设置为 true
  • 主机名是运行要建立连接的 Sun Java System Application Server 的计算机的主机名(缺省为 localhost)。
  • 端口值与要建立连接的 BPEL 服务引擎的 DebugPort 属性相同(缺省为 3343)。
Unable to start a debug session : Already connected to <host>:<port>
您已在运行一个与此特定服务引擎连接的调试会话。
Debug session terminated : Target disconnected
调试器与服务器的连接中断。请检查服务器是否正在运行以及网络是否正常。
Stop connecting
您在调试会话进行连接时显式地将其终止。
Debug session finished
您在调试会话运行时显式地将其终止。

调试器混淆不同项目中的 BPEL 源

问题 79288

如果在 IDE 中两个流程具有相同的 qname,并且在这两个流程的不同元素上设置了断点,则当您只部署和调试其中一个流程时,BPEL 调试器会在两个流程指定的所有断点处停止。这是因为 BPEL 调试器连接的是 BPEL 引擎自身,而不是单独的流程。

假定您有两个不同名的项目(例如,SynchronousSample 和 SynchronousSample1),但这两个项目包括同名的流程 (SynchronousSample),并且假定在这两个流程中都设置了断点,其中一个流程 SynchronousSample 已被部署,而另一个流程 SynchronousSample1 则被关闭,甚至未在 IDE 中打开。当您开始进行调试时,调试器将在所有断点(即,两个文件中的所有断点)处停止。这会导致意外的结果发生,因为 IDE 在到达某个断点时会自动打开一个源文件;在本示例中,它将打开 SynchronousSample1.SynchronousSample 流程文件,并在其中一个断点处停止。此问题的解决方法是:清除冲突流程文件中的断点。

有关调试的详细信息,请参见调试 BPEL 流程部分。

无法显示图

问题 87719

通常,仅当 BPEL 源文件的格式不正确时,“设计”视图才会显示消息“无法显示图”。在这种情况下,建议的解决方法是:转至“源”视图,然后运行“检查 XML”操作和/或“验证 XML”操作。这些操作将指示需要在 BPEL 源文件中纠正哪些错误。请进行相应的更正。保存该文件。此时,“设计”视图应该能够正确地呈现图。但是,在某些情况下,甚至当 BPEL 文件格式正确时,“设计”视图也会报告“无法显示图”。问题 87719 中提到了一种此类情况。在这种情况下,BPEL 文件的格式实际上是正确的,但“设计”视图继续报告“无法显示图”。对于这种情况,唯一的解决方法是重新启动 IDE。在重新启动后,应该会正确地呈现图。



返回页首

Bookmark this page

del.icio.us furl simpy slashdot technorati digg
Companion
Projects:
MySQL Database Server   Open JDK: an Open SourceJDK   GlassFish Community: an Open Source Application Server    Mobile & Embedded Community    Open Solaris   java.net - The Source for Java Technology Collaboration   Virtual Box - full virtualizer  Open ESB - The Open Enterprise Service Bus Powered by