了解旅行预订服务
撰稿人:Bob May,由 Irina Filippova 维护
2007 年 12 月
- 该过程假定,客户端在过程开始时,发送一个包含部分 travel itinerary 文档的消息。
- 客户端的旅行线路可能包含:
- 没有任何原有预定,或者
- 原有航班预定、汽车预定、旅馆预定的组合。
- 旅行预订服务查看传入的客户端行程,然后将行程补充完整。
- 如果客户端行程未包含原有的航班预定,则旅行预订将该行程传递给其合作伙伴服务 Airline Reservation 服务添加航班预定。
- Airline Reservation 服务将修改后的行程发送回旅行预订服务。
- 对于汽车和旅店预定,旅行预订服务的处理方式也与此类似。它将实际的预定供应委托给 Vehicle Reservation 服务和 Hotel Reservation 服务。
- 最后,旅行预订服务将补充完整的行程传回原客户端,整个过程结束。
预计时间:60 分钟
目录
回到顶部
教程要求
在开始之前,确保对本节的系统要求有所了解。
配置和启动 GlassFish 应用服务器。
当我们安装完整版本的 NetBeans 6.0 时,GlassFish 应用服务器将一并安装。NetBeans IDE 将在需求时自动启动应用服务器。
启动 GlassFish 应用服务器:
- 如果“服务”窗口不可见,则选择“窗口”>“服务”选项。
- 在“服务”窗口中,展开“服务器”节点。
“服务器”节点中应该包含 GlassFish Application Server 子节点。如果未出现 GlassFish Application Server 节点,请参阅 配置 GlassFish 应用服务器。

- 右键单击 GlassFish 应用服务器节点并选择“启动”。
“输出”窗口将显示关于应用程序启动的日志信息:如果“输出”窗口不可见,请选择“窗口” > “输出” > “输出”选项。
如果 Application server startup complete 消息出现在输出窗口中,则表示应用服务器正在运行。
注意: 如果 GlassFish 应用服务器节点上出现了一个绿色的箭头标志,则表示服务器正在运行。
注意:在 GlassFish 应用服务器中部署应用程序将自动启动 GlassFish 应用服务器。这样,我们就不需要手动启动该应用服务器。
注意:以下步骤将演示如何配置 NetBeans 6.0 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 的主菜单中,选择“文件”>“新建项目”。
- 在“类别”中选择 Samples > SOA。
- 在“项目”中选择 旅行预订Service 并单击“一下步”。

- 可以接受默认值,也可以键入项目名称并选择位置。
注意,在本文中,项目名称为 TravelReservationService。
- 单击“完成”。
“项目”窗口现在包含三个项目节点:一个对应于 TravelReservationService,BPEL 模块;一个对应于 TravelReservationServiceApplication,复合应用程序项目;一个对应于 ReservationPartnerServices,绑定的 EJB 项目。

回到顶部
部署合作伙伴 Web 服务项目
旅行预订服务将通过它们的公开接口与其伙伴服务进行通信。这些接口定义在特定于伙伴的 WSDL 文件中。
IDE 包含名为 ReservationPartnerServices 的绑定 EJB 项目。ReservationPartnerServices 项目包含一个基本 EJB 和基于 JMS 的三方服务实现。这些合作伙伴服务有:Hotel Reservation 服务、Vehicle Reservation 服务和 Airline Reservation 服务。合作伙伴 Web 服务必须部署到绑定的 GlassFish 服务器中,然后才能够测试运行旅行预订服务过程。
该实现只用于充当旅行预订服务过程的测试工具。BPEL 开发人员不需要了解合作伙伴服务的实现。这些是测试旅行预订服务的唯一前提条件。
部署 ReservationPartnerServices 项目:
- 在“项目”窗口中,右键单击 ReservationPartnerServices 节点,然后选择“取消部署和部署”。这将部署 ReservationPartnerServices。
- 执行以下步骤,验证是否成功部署了 ReservationPartnerServices 应用程序:
- 切换到“运行时”窗口然后展开 GlassFish V2 节点。
- 展开 Applications 节点,然后展开 EJB Modules 节点。

回到顶部
将复合应用程序项目部署到应用服务器上
TravelReservationServiceApplication 项目已经将 BPEL 项目作为 JBI 模块包含(查看 TravelReservationServiceApplication > JBI 模块> TravelReservationService.jar 节点)。部署 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 发送一条以这些接收活动为目标的消息。
此版本 BPEL 设计器的功能能使这一测试过程成为“指向并单击”体验。具体来说,有了 TravelReservationService 示例项目,您可以向部署的 TravelReservationService 发送 buildItinerary 请求。
要测试运行 TravelReservationService:
- 展开 TravelReservationServiceApplication >测试节点。
有 4 个子节点:
- HasNoReservations - 测试行程,不包含任何预定
- HasAirline - 测试行程,已有航班预定
- HasVehicle - 测试行程,已有航班预定和汽车预定
- HasHotel - 测试行程,已有航班预定、汽车预定和旅馆预定
这些测试节点实际上是包含 SOAP 消息数据的 XML 文件。每个文件表示的情况各不相同,以便能以稍微不同的方式测试 TravelReservationService。
- 右键单击 HasNoReservations 节点,然后从弹出菜单中选择“运行”。
选择了“运行”操作后,IDE 将 HasNoReservations SOAP 消息发送到 BPEL 运行时。IDE 将指示测试是否成功。

注意事项:
回到顶部
调试旅行预订服务过程
您可以使用 IDE 来调试示例 BPEL 应用程序。
一般调试步骤
- 在“项目”窗口的 TravelReservationService >流程文件节点下,右键单击 TravelReservationService.bpel 文件。
- 在“源代码编辑器”中设置源代码的断点只需单击想仿制端点的元素的行号。我们将使用 HasNoReservations 测试,所以应该对调用全部三个合作伙伴的服务放置断点。
- 在 ReceiveItinerary 放置断点接收第 97 行的活动。这是启动过程的活动。如果行号不可见,则选择“视图”>“在主菜单中显示行号”

还可以对图设置断点。要在图中设置断点,请切换至“设计”视图,右键单击元素,然后从弹出菜单中选择“切换断点”。

含有断点的元素上方将显示一个红色方块。

位于“导航”窗格“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 的测试节点下右键单击 HasNoReservations,选择“运行”启动测试。
- 当过程到达第一个断点时,观察以下窗口:
- BPEL 变量窗口
它显示当前过程实例的本地变量及其值的结构,以及当前过程实例暂停的位置。
注意,您可以在“值”对话框访问和修改与特定变量有关的 XML 部分(如果值为 XML)。要显示该对话框,按 BPEL 变量窗口最下方一行的 ellipsis (...) 按钮。
- 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) 表达式(检查传入消息是否包含 Airline 预定项)的值将设置为 false。
- 单击“继续”。
HasNoReservations 测试成功通过后完成整个过程。
- 从主菜单中选择“运行”>“完成调试会话”。
调试断点动作
过程实例挂起后,您可以执行一下调试工具栏动作(如果调试工具栏不可见,则选择“视图”>“工具栏”>“调试”):
- 完成调试器会话 (Shift-F5)。结束当前的调试会话。
- 继续 (Ctrl-F5)。运行当前过程实例,直至遇到下一个断点或者过程实例完成时为止。
- 步入 (F7)。步入下一个 BPEL 活动。只有 BPEL 语言的细粒度活动才支持此步骤。不再步入更细节的操作。进行步入时,当前行指示符的位置将前移,并相应地更改“BPEL 变量”和“监视”窗口的内容。
- 执行到光标所在行 (F4). 允许执行过程时,在导航器、源代码和设计视图的 BPEL 设计程序中自动设置断点。
回到顶部