服务端点冲突
在部署复合应用程序时,系统将尝试为部署的流程定义一个或多个服务端点。每个服务端点必须是唯一的。因此,如果尝试部署两个具有相同服务端点定义的流程,系统会将这种情况标记为错误,并且无法成功完成部署。此时,将显示类似于以下内容的消息:
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 文件
-
在 TravelReservationService BPEL 模块中,将
AirlineReservationService.wsdl 中的 soap 地址值由
<soap:address
location="http://localhost:8080/webservice/AirlineReservationService"/>
更改为
<soap:address
location="http://localhost:8090/webservice/AirlineReservationService"/>
-
类似地,更新 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
请执行以下步骤:
-
在 IDE 中,打开 ReservationPartnerServices 项目。
(IDE 在您创建 TravelReservationService 项目的位置创建了 ReservationPartnerServices 项目。)
-
在“项目”窗口中,依次展开 "ReservationPartnerServices" 项目节点和“配置文件”节点,然后双击 "ejb-jar.xml" 节点以在 ejb-jar.xml 可视编辑器中打开该文件。
-
在编辑器中的 "Enterprise Bean" 下面,单击 "ReservationCallBackProviderMDB" 以展开该条目。展开“Bean 环境”,然后展开“环境条目”。
-
在“环境条目”下面,选择每个条目,然后单击“编辑”以更改“条目值”字段中的 18181 端口号。
例如,对于 AirlineCallbackURL,将
http://localhost:18181/TravelReservation/airlineReserved
更改为
http://localhost:19191/TravelReservation/airlineReserved
更新“目标”属性
-
在 TravelReservationServiceApplication 复合项目中:
-
展开“测试”节点,对于它下面的每个测试用例节点:
-
右键单击测试用例节点,然后选择“属性”。
-
在“属性”窗口中,更新“目标”属性的值。
示例:
将 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。在重新启动后,应该会正确地呈现图。