理解旅行预订服务
- 本进程假设是由客户端通过发送一个包含不完整的旅行日程文档的消息所引发的。
- 客户端的旅行日程可以:
- 没有事先的预订,或者
- 已有事先的飞机、汽车和/或旅馆预订的组合。
- 旅行预订服务检查前来的客户日程,并处理日程直到期满。
- 如果客户端日程不包含事先的飞机预订,旅行预订服务把日程传到它的伙伴服务(飞机预订服务)来添加飞机预订。
- 飞机预订服务把修改后的日程传回给旅行预订服务。
- 对于汽车和旅馆预订,旅行预订服务都进行类似的处理。在这两种情况下,它把预订的实际置备代理给汽车预订服务和旅馆预订服务。
- 最后,旅行预订服务把完成的日程传回给原来的客户端,结束进程。
预计持续时间:60 分钟
内容
页首
教程需求
在开始前,请确保您重新检查了本节中的需求。
先决条件
本教程假设您具有 Java 语言和平台、NetBeans IDE 的一些基本知识或编程经验。
系统需求
本教程假设您的系统符合在
NetBeans IDE 6.0 发行说明的系统需求话题中所规定的需求。
本教程所需的软件
在开始前,您需要在计算机上安装以下软件:带 SOA 的 NetBeans IDE 6.0 和 GlassFish 应用程序服务器,可从
NetBeans IDE 6.0
下载里面的“全部”下载得到。
页首
配置和启动 GlassFish 应用程序服务器
在您安装完全版的 6.0 时,就已经包括了 GlassFish 应用程序服务器。NetBeans IDE 将在需要的时候自动启动应用程序服务器。
要启动 GlassFish 应用程序服务器:
- 如果看不到“服务”窗口,请选择“窗口”>“服务”。
- 在“服务”窗口中,展开“服务器”节点。
“服务器”节点应该包含有 GlassFish 应用程序服务器的子节点。如果 GlassFish 应用程序服务器没有出现,请转到要配置
GlassFish 应用程序服务器。

- 右键单击 GlassFish 应用程序服务器节点,选择“启动”。
“输出”窗口会显示应用程序启动的日志信息。如果看不到“输出”窗口,请选择“窗口”>“输出”>“输出”。
当消息 Application server startup complete 显示到“输出”窗口时,应用程序服务器就正在运行了。
注意:如果 GlassFish 应用程序服务器节点上出现一个绿箭头标记,服务器就在运行。
注意:把应用程序部署到 GlassFish 应用程序服务器时,将自动启动服务器。这样,您就不必手动启动应用程序服务器。
注意:以下过程展示如何配置 IDE 以使用另一个版本的 GlassFish V2 应用程序服务器。
要配置 GlassFish V2 应用程序服务器:
您可能想使用不同版本的应用程序服务器,而不是随 NetBeans 6.0 提供的那个。例如,您也许想从
GlassFish 社区网站下载并安装更新版本的 GlassFish
V2 应用程序服务器。
以下过程展示如何配置 NetBeans 6.0 IDE 以使用另一个版本的 GlassFish V2 应用程序服务器。假设您已经下载并安装了另一个版本的应用程序服务器。
- 在“服务”窗口,右键单击“服务器”节点,并从弹出菜单选择“添加服务器”。
将打开“添加服务器实例”对话框。
- 在“选择服务器”页,从列表选择“GlassFish V2”。
- 单击“下一步”。
将打开“平台文件夹位置”页。
- 在“平台位置”字段,使用“浏览”按钮来导航并选择应用程序服务器的安装位置。
如果您把 GlassFish 应用程序服务器安装到了缺省位置,请参考表 1 来找到安装位置。否则,请导航到您安装
GlassFish V2 应用程序服务器的位置。表 1:应用程序服务器的缺省安装目录
Solaris OS
Linux |
root |
/opt/glassfish-v2 |
/opt/SUNWappserver |
Solaris OS
Linux |
user |
~/glassfish-v2 |
~/SUNWappserver |
| Mac OS X |
N/A |
/Applications/NetBeans/glassfish-v2b58g |
/Applications/NetBeans/NetBeans 6.0 |
| Windows |
N/A |
C:\Program Files\glassfish-v2-b58g |
C:\Sun\AppServer |
- 选中“注册本地缺省域”单选按钮并单击“下一步”。
- 输入域管理员的用户名和口令。
如果您在安装过程中接受了缺省值,用户名是 admin,口令是 adminadmin。
- 单击“完成”。
页首
从旅行预订服务样例项目新建项目
- 从 IDE 的主菜单选择“文件”>“新建项目”。
- 在“类别”中选择“样例”>“SOA”。
- 在“项目”下,选择“Travel Reservation Service”,单击“下一步”。

- 接受缺省值,或者键入您想要的项目名称和位置。
注意在本文档中,项目名称为 TravelReservationService。
- 单击“完成”。
“项目”窗口现在包含三个项目节点:一个 BPEL 模块 TravelReservationService、一个复合应用程序项目
TravelReservationServiceApplication 和一个捆绑的 EJB 项目 ReservationPartnerServices。

页首
打开并部署伙伴 Web 服务项目
旅行预订服务通过公共接口和它的伙伴服务通信。这些接口定义在伙伴特有的的 WSDL 文件中。
IDE 包括一个捆绑的 EJB 项目 ReservationPartnerServices。ReservationPartnerServices
项目包含一个基本的 EJB 和三个伙伴服务基于的 JMS 实现。三个伙伴服务分别是旅馆预订服务、汽车预订服务和飞机预订服务。在您测试运行旅行预订服务进程前,三个伙伴
Web 服务必须部署到捆绑的 GlassFish 应用程序服务器中。
本实现只是用来作为旅行预订服务进程的测试工具。伙伴服务的实现不应该引起 BPEL 开发人员的任何兴趣。它们仅仅是旅行预订服务的可测试性的先决条件。
要部署 ReservationPartnerServices 项目:
- 在“项目”窗口,右键单击 ReservationPartnerServices 节点,选择“取消部署/部署”。这将部署
ReservationPartnerServices。
- 通过下列步骤来验证 ReservationPartnerServices 应用程序已成功部署:
- 切换到“运行时”窗口,展开“GlassFish V2”节点。
- 展开 Applications 节点,然后展开“EJB 模块”节点。

页首
把复合应用程序部署到应用程序服务器
TravelReservationServiceApplication 项目已经包含一个作为 JBI 模块(参见“TravelReservationServiceApplication”>“JBI
模块”>“TravelReservationService.jar”节点)的 BPEL 项目。部署 TravelReservationServiceApplication
复合应用程序以使应用程序服务器能获取服务组合件,进而允许其服务单元运行。
- 在“项目”窗口中,右键单击 TravelReservationServiceApplication 项目节点,从弹出菜单选择“部署”。
- 在“警告”对话框,确保“GlassFish V2”被选中,单击“确定”。
如果您在“输出”窗口中看到了以下消息,则证明部署成功:

页首
进行旅行预订服务进程的测试运行
测试运行功能使得业务进程开发人员能对他们的进程进行测试运行。BPEL 进程被部署到管理进程生命周期的 BPEL 运行时。一个 BPEL 进程接收或挑拣到能引发进程的活动时启动。
BPEL 进程也是 Web 服务。像其它 Web 服务一样,BPEL 进程伴有一个描述其公共接口的 WSDL 文件。该接口依次描述客户端能获取以创建进程实例的操作和消息。在接收到目标为这些接收活动之一的消息时,BPEL
运行时将创建一个 BPEL 进程实例并把消息交给进程实例处理。
例如,在 TravelReservationService.wsdl 中有一个操作 buildItinerary。这就是
TravelReservationService 客户端将调用以引发与 TravelReservationService 进行对话的操作。
<portType name="TravelReservationPortType">
<operation name="buildItinerary">
<input message="tns:ItineraryIn"/>
<output message="tns:ItineraryOut"/>
<fault name="itineraryProblem" message="tns:ItineraryFault"/>
</operation>
</portType>
这样,要测试 BPEL 进程,您必须给 BPEL 发送目标为这些进程接收活动之一的消息。
This version of the BPEL Designer contains features to make this testing a point-and-click
experience. Specifically, with the TravelReservationService sample project,
you can send buildItinerary requests to the deployed TravelReservationService.
该版本的 BPEL 设计器包含单击鼠标即可测试的功能。特别地,对于 TravelReservationService 项目,您可以发送
buildItinerary 请求给已部署的 TravelReservationService。
要测试运行 TravelReservationService:
- 展开“TravelReservationServiceApplication”>“Test”节点。
有 4 个子节点:
- HasNoReservations - 没有预订的测试日程
- HasAirline - 有事先的飞机预订的测试日程
- HasVehicle - 有事先的飞机和汽车预订的测试日程
- HasHotel - 有事先的飞机和汽车和旅馆预订的测试日程
These test nodes are actually XML files that contain SOAP message data. Each
one represents a different case that can be used to test the TravelReservationService
in order to exercise the process in slightly different ways. 这些测试节点实际上是包含 SOAP
消息数据的 XML 文件。每个都代表不同的用例,可用来测试 TravelReservationService,以便用稍微不同的方式运行进程。
- 右键单击 HasNoReservations 节点,从弹出菜单选择“运行”。
一旦您选择“运行”操作,IDE 就把 HasNoReservations SOAP 消息发送到 BPEL 运行时。IDE 将指出测试是否成功。

注意:
页首
调试旅行预订服务进程
您可以用 IDE 来调试您的样例 BPEL 程序。
一般调试步骤
- 在“项目”窗口中的“TravelReservationService”>“Process Files”节点下,双击
TravelReservationService.bpel 文件。
- 在“源代码编辑器”中,通过单击您想放置断点的元素的行号来设置断点。我们将使用 HasNoReservations 测试,所以我们将在调用所有三个伙伴服务的活动上放置断点。
- 在 97 行的 ReceiveItinerary 接收活动上放置断点。这是引发进程的活动。如果看不到行号,请从主菜单选择“视图”>“显示行号”。

You can also set breakpoints on the diagram. To do so, switch to
the Design view, right-click the element and choose Toggle Breakpoint
from the pop-up menu.您还可以在图上设置断点。要这样做,请切换到“设计”视图,右键单击元素并从弹出菜单选择“设置断点”。

元素顶端会出现一个表示断点的红色方块。

“设置断点”弹出菜单命令也能用在“导航器”的“BPEL 逻辑视图”里的元素上。如果没有打开“导航器”窗口,请从主菜单选择“窗口”>“导航”>“导航器”。对于带断点的元素,“导航器”会显示如下图所示的红色小方块(ReceiveItinerary):

- 在 ReserveAirline(第 130 行)、ReserveVehicle(第 183
行)和 ReserveHotel(第 236 行)这些调用活动上分别放置断点。
- 现在把监视添加到您的项目:
- 如果看不到“监视”窗口,请从主菜单选择“窗口”>“调试”>“监视”。
- 在“源代码”视图,转到第 127 行,复制 XPath 表达式:
not($ItineraryIn.itinerary/ItineraryInfo/ReservationItems/Item/Air)
或者,如果元素在图上,选择 HasAirline,从“属性”窗口的“条件”行复制 XPath 表达式。如果看不到“属性”窗口,请从主菜单选择“窗口”>“属性”。

- 在“监视”窗口里右键单击,选择“新建监视”。
- 在“新建监视”对话框里,把 XPath 表达式粘贴到“监视表达式”子段,单击“确定”。
- 为第 180 和 233 行的表达式再添加两个监视。您的“监视”窗口应该有三项:

- 在“项目”窗口里,右键单击 TravelReservationServiceApplication 节点,选择“调试项目(BPEL)”。
- 等到“输出”窗口出现“BUILD SUCCESSFUL”消息。
- 切换到“BPEL 调试器控制台”窗口,确保“Debug session started”消息已出现。
- 确保您打开了下列窗口:
- BPEL 变量;如果没打开,请从主菜单选择“窗口”>“调试”>“BPEL”>“BPEL 变量”。
- BPEL 进程实例;如果没打开,请从主菜单选择“窗口”>“调试”>“BPEL”>“BPEL 进程实例”。
- BPEL 进程执行;如果没打开,请从主菜单选择“窗口”>“调试”>“BPEL”>“BPEL 进程执行”。
- 在“项目”窗口中,右键单击 TraveReservationServiceApplication 下的 Test
节点下的 HasNoReservations,选择“运行”开始测试。
- 当进程到达第一个断点时,观察下面的窗口:
- “BPEL 变量”窗口。
它显示当前进程实例的本地变量结构和它们的值,以及当前进程实例挂起的位置。
注意您可以在以 XML 提供值的“值”对话框里访问和修改附属于各个特定变量的 XML 片段。要显示该对话框,请点按“BPEL 变量”窗口中行末的省略号(...)按钮。
- “BPEL 进程实例”窗口。
它列出当前的调试会话里,所有运行在 BPEL 服务引擎中的 BPEL 进程实例。
编号的 TravelReservationService 实例应该处于 Suspended 状态。
- “BPEL 进程执行”窗口。
它图形化地展现在 BPEL 调试器中,当前 BPEL 进程实例的执行进度。
ReceiveItinerary 活动应该以绿色高亮显示,这说明它此刻正在被执行。
其它的活动是灰色的,因为它们还没有被执行。
- “监视”窗口。
对于全部三个表达式,它应该在“值”列里包含 <Cannot evaluate the expression> 字符串。这是因为进程在第一个接收活动刚开始,而
ItineraryIn 尚未到达时,进程停止了。
- 在“调试”菜单上单击“继续”(Ctrl-F5)。进程停在第二个断点处。到现在 ItineraryIn 已经到达,监视里的条件已被求值。全部三个表达式的值应该被设置为
true。
注意:如果消息不包含相应的预订项,表达式返回 true。如果您运行 HasAirline 测试,检查到来的消息是否包含飞机预订项的表达式
not($ItineraryIn.itinerary/ItineraryInfo/ReservationItems/Item/Air)
的值将被设为 false。
- 单击“继续”。
进程结束后,HasNoReservations 测试成功通过。
- 从主菜单选择“运行”>“结束调试器会话”。
断点处的调试操作
一旦进程实例挂起,您就可以进行任何下列常见的“调试”工具栏操作(如果看不到“调试”工具栏,请选择“试图”>“工具栏”>“调试”):
- 结束调试器会话(Shift-F5)。结束当前调试会话。
- 继续(Ctrl-F5)。导致当前进程实例运行,直到遇到下一个断点,或直到进程实例结束。
- 步入(F7)。步入到下一个 BPEL 活动。步入只在一个 BPEL 语言项的活动的粒度上受支持。它不支持步入更细的粒度。在您步入时,当前的行指示器将会前行,“BPEL
变量”和“监视”窗口的内容会相应改变。
- 运行到光标(F4)。允许在“导航器”窗口以及 BPEL 设计器的“源代码”和“设计”视图中,在执行进程时动态设置断点,
页首