本教程介绍在 BPEL 流程中使用相关集、属性和属性别名的方式和时间。还介绍为了配置这些元素 NetBeans Enterprise Pack 提供的可视工具。在一个 BPEL 过程示例的基础上,您将会看到相关集、属性和属性别名如何支持异步业务协作。
每个 BPEL 业务流程都是一个 Web 服务,因此可能您只需要知道目标端口就可以向 BPEL 流程发送消息。但是,由于业务流程是状态流程,并且已被实例化为根据它们的状态起作用,因此使用 BPEL 相关集以标准、与实现无关的方式来支持 Web 服务之间的状态协作。
相关集依赖于消息封装、标题或业务文档自身中存储的相关数据。相关性的声明依赖于声明的消息属性。属性只是消息中由查询标识的一个字段。查询由名为属性别名的特定结构指定。
本教程假设您基本了解 NetBeans IDE 或者有使用它编程的经验。
本教程假设您的系统达到了 NetBeans Enterprise Pack 5.5.1 Beta Release Notes 的“System Requirements”主题中指定的要求。
注意:现在,NetBeans IDE 5.5.1 Release Candidate 已发布。NetBeans Enterprise Pack 5.5.1 Beta 与此 RC 版本的 IDE 结合使用。我们不指望发布 NetBeans Enterprise Pack 5.5.1 Beta 的任何进一步更新。现在,我们的开发精力全都集中在 NetBeans 6.0 和 SOA Pack 上。有关详细信息,请参见 Announcing the availability of NetBeans 6.0 SOA Pack。
开始之前,您必须在计算机上安装以下软件:
l NetBeans IDE 5.5.1 RC1
l NetBeans Enterprise Pack 5.5.1 Beta
l 要完成本教程中的部署步骤,您必须安装 Sun Java System Application Server Platform Edition 9.1 Beta。该应用程序服务器与 NetBeans Enterprise Pack 5.5.1 Beta 捆绑在一起下载。
l 配置和启动 Sun Java 系统应用程序服务器
l 打开、部署和测试示例项目
l 向示例业务流程中添加状态
l 定义相关属性和属性别名
l 创建和添加相关集
l 调试和测试 BPEL 流程
l 小结
部署应用程序之前,必须正确配置并运行 Sun Java 系统应用程序服务器。
注意:在下面的步骤中,Sun Java System Application Server 节点是指表示该应用程序服务器中安装 Sun Java System Application Server 9.1 的节点。
检查 Sun Java 系统应用程序服务器的状态:
1. 如果没有看到 Runtime 窗口,请选择 Window > Runtime。
2. 在 Runtime 窗口中,展开 Servers 节点。
Servers 节点应该包含一个 Sun Java System Application Server 子节点。
如果在 Sun Java System Application Server 节点上出现了一个绿色的箭头标记,则表示该服务器正在运行。
配置 Sun Java 系统应用程序服务器:
1. 如果没有看到 Runtime 窗口,请选择 Window > Runtime。
2. 在 Runtime 窗口中,右键单击 Servers 节点,然后从弹出菜单中选择 Add Server。
将打开 Add Server Instance 对话框。
3. 在 Choose Server 页面上,从 Server 下拉列表中,选择 Sun Java System Application Server。
4. (可选)在 Name 字段中,更改服务器的默认名称。
IDE 使用该名称标识该服务器。
5. 单击 Next。
将打开 Platform Location Folder 页面。
6. 在 Platform Location 字段中,使用 Browse 按钮导航到该应用程序服务器的安装位置并选择该位置。
根据安装类型和平台,默认的安装位置可能不同,如表 1 所示。
表 1:默认的应用程序服务器安装目录
平台 |
安装身份 |
Enterprise Pack 安装 |
工具包安装 |
Solaris OS |
root |
/opt/SUNWappserver |
/opt/SDK |
Solaris OS |
user |
~/SUNWappserver |
~/SDK |
Mac OS X |
N/A |
~/SUNWappserver |
~/SDK |
Windows |
N/A |
C:/Sun/AppServer |
C:/Sun/SDK |
7. 选择 Register Local Default Domain 单选按钮并单击 Next。
8. 输入域管理员的用户名和密码。
如果您接受安装过程中的默认值,则用户名为 admin,密码为 adminadmin。
9. 单击 Finish。
启动 Sun Java 系统应用程序服务器:
1. 在 Runtime 窗口中,右键单击 Sun Java System Application Server 节点,然后选择 Start。
2. 等待 Output 窗口中出现以下消息:
Application server startup complete.
当该服务器正在运行时,IDE 会在 Sun Java System Application Server 节点上显示一个绿色箭头标记。
确保 BPEL 服务引擎已启动:
1. 展开 Sun Java System Application Server > JBI > Service Engines。
2. 右键单击 com.sun.bpelse-1.0-2 节点,然后从弹出菜单中选择 Start。
等待在 Output 窗口中显示 BPEL service engine started. 消息。
如果 Start 选项不可用(灰显),则表示该服务引擎已启动,您可以继续本教程中的下一部分。
本部分从简单的 HelloWorld 业务流程开始。最初,该流程是一个同步流程并且不需要相关集。在该流程的开始只接收用户名,并且返回 Hello <User Name > 消息。在本部分中,您将打开并测试该流程。
本教程包含一个压缩的项目,名为 HelloWorldSample。
打开 HelloWorldSample 和 HelloWorldSampleCompApp 项目:
1. 在您的文件系统中,创建一个名为 HelloTut 的目录。
2. 下载 bpel-correl-helloworld.zip 文件并将其解压缩到 HelloTut 目录中。
3. 从 IDE 的主菜单中,选择 File > Open Project。
将打开 Open Project 向导。
4. 导航到 HelloTut > HelloWorldSample 目录,选择 HelloWorldSample 和 HelloWorldSampleCompApp 项目,然后单击 Open Project Folder。
将出现进度对话框,然后出现 Open Project 对话框。
注意:打开进度对话框,然后打开 Open Project 对话框通知您引用问题。
此时,由于复杂应用程序对 JBI 模块有依赖关系,因此在本教程中,这是正常行为。
您随后将会在该任务中解决这个断开的引用问题。
5. 单击 Close 关闭 Open Project 对话框。
6. 右键单击 HelloWorldSampleCompApp 项目,然后选择 Resolve Reference Problems。
7. 在 Resolve Reference Problems 对话框中,单击 Resolve。
8. 在 Browse Project 对话框中,导航到 HelloWorldSample 项目并选择该项目,然后单击 Open Project Folder。
现在,Resolve Reference Problems 对话框显示该问题已解决。
9. 单击 Close 关闭 Resolve Reference Problems 对话框。
部署 HelloWorldSampleCompApp 项目:
1. 右键单击 HelloWorldSampleCompApp,然后选择 Deploy Project。
将显示 Select Server 对话框。
2. 选择 Sun Java System Application Server 9 作为目标应用程序服务器,然后单击 OK。
3. 等待 Output 窗口中显示 BUILD SUCCESSFUL 消息。
4. 要验证 HelloWorldSampleCompApp 应用程序是否已成功部署,请切换到 Runtime 窗口。
5. 展开 Sun Java System Application Server > JBI > Service Assemblies。
如果在 Service Assemblies 节点下出现 HelloWorldSampleCompApp 节点,则表示该应用程序已成功部署。
测试 HelloWorldSampleCompApp 项目:
1. 在 Projects 窗口中,展开 HelloWorldSampleCompApp > Test > SendUserName1。
2. 双击 Output 以检查它的内容。
请注意,Output.xml 是空的。第一次运行测试将用真实的输出填充 Output.xml。以后运行测试将比较真实输出与 Output.xml 的内容。
3. 在 Projects 窗口中,右键单击 SendUserName1 节点,然后从弹出菜单中选择 Run。
在该测试中,您向流程中发送用户名,该流程将预设的 Hello Michael 消息发送回客户端以验证该流程工作状态正常。
注意:第一次运行是特例,原因是 Output.xml 是空的并且输出已写入到 Output。
注意 JUnit Test Results 窗口中的失败消息。
打开 Overwrite Empty Output 对话框,以便您可以确认要覆盖 Output.xml。
4. 单击 Yes。
第一次运行之后,Output 不再是空的。显示 Output.xml 的内容并且不被新的结果覆盖。
5. 在 Projects 窗口中,右键单击 SendUserName1 节点,然后从弹出菜单中选择 Run。
在本部分中,您将向 HelloWorld 业务流程添加另一个 Receive 活动。该活动向流程中添加异步通信,并且该流程成为状态流程。
将用前缀字符串扩展该流程返回的结果消息。
向示例业务流程中添加状态:
1. 在 Projects 窗口中,展开 HelloWorldSample > Process Files。
2. 双击 HelloWorldProcess.bpel 文件。
将在 BPEL Designer 的 Design 视图中打开 HelloWorldProcess.bpel 文件。
3. 在 Design 视图 Palette 的 Web Service 部分,选择 Receive 图标并将您的选择拖动到 ReceiveUserName 和 AddHello 活动之间的占位符上。
IDE 提供有关放置选择的可视提示。该操作向图表中添加一个名为 Receive1 的 Receive 活动。
4. 双击 Receive1 活动。
将打开 Receive1[Receive] - Property Editor。
5. 在 Name 字段中,键入 SetPrefix。
6. 从 Partner Link 下拉列表中,选择 ProcessInterface。
7. 从 Operation 下拉列表中,选择 setPrefix。
8. 执行以下操作新建一个输入变量:
a. 单击 Input Variable 字段旁边的 Create 按钮。
将打开 New Input Variable 对话框。
b. 将 Name 字段中的值更改为 Prefix。
c. 单击 OK。
9. 单击 OK 关闭 Receive1 [Receive] - Property Editor。
现在,Design 视图中的 Receive 活动已标记为 SetPrefix。
10. 双击 AddHello 活动。
将在 IDE 的底部显示 BPEL Mapper。
11. 通过在 BPEL Mapper 窗口中执行以下操作,向欢迎输出字符串中的用户名中添加前缀:
a. 选择 Variables > UserNameRequest > part1 > data 节点和 Concat 函数的 string2 部分之间的现有链接,然后按 Delete。
b. 在左侧树窗格中,展开 Variables > Prefix > part1。
c. 选择 data 并将指针拖动到 Concat 函数的 string2 部分中。
d. 在左侧树窗格中,展开 UserNameRequest>part1。
e. 选择 data 并将指针拖动到 Concat 函数的 string3 部分中。
f. 按 Ctrl-S 保存您的编辑。
通过完成本部分中的步骤,您已经将一个异步通信添加到流程中。
现在,收到第一个消息并且初始化该流程之后,BPEL 流程需要等待 SetPrefix 活动的另一个消息。
想像一种情况,即多个流程实例已实例化,并且所有这些流程都在等待第二个 Receive 活动的消息。
BPEL 服务引擎使用相关集决定将该消息发送到哪个流程实例。
作为以上更改的结果,在本例中,该流程返回欢迎字符串,其前缀为 Mr.。
注意,您没有在任何位置设置前缀值,它是从欢迎消息的 SendPrefix 测试中自动连接的,如果该测试成功通过的话,会返回此连接的消息。
在本部分中,您将定义相关属性和属性别名。通常,使用属性来存储具有消息的相关服务实例的标记。使用属性别名可指定从消息中提取数据的哪个部分以及所提取数据需要关联的属性。
创建属性:
1. 从主菜单中选择 Window > Navigator。
2. 在 Design 视图中,选择 HelloWorldProcess 业务流程。
Navigator 窗口显示 BPEL Logical View。BPEL Logical View 显示该业务流程的结构视图。
3. 在 Navigator 窗口中,展开 Imports。
注意:您使用 HelloWorldProcessWSDLWrapper.wsdl 添加所需的属性和属性别名。
从传入消息的标识字段中获得标识正确的流程实例的信息。
接下来,您需要定义存储相关标记的属性。
4. 右键单击 /HelloWorldProcessWSDLWrapper.wsdl 节点,然后从弹出菜单中选择 Add Property。
将出现 Create New Correlation Property 对话框。
注意:您必须指定属性名称和类型才能定义属性。
使用属性名称引用相关集和属性别名中的属性,该名称可以是任何有效的名称。
属性类型指定要存储在属性中的相关数据的类型。
5. 在 Name 字段中,键入 MyProperty。
6. 选择 string 作为 Built-in Types 树中的属性类型。
7. 单击 OK。
该操作关闭 Create New Correlation Property 对话框并在 HelloWorldProcessWSDLWrapper.wsdl 节点下面添加 MyProperty 子节点。
8. 展开 HelloWorldProcessWSDLWrapper.wsdl 节点即可看到您创建的属性。
现在,您需要创建属性别名以指定从消息中提取相关数据的方式。
由于您有两个接收不同类型消息的 Receive 活动,因此您需要定义两个属性别名(一个消息类型一个属性别名)。
创建第一个属性别名:
1. 在 Navigator 窗口中,展开 Imports。
2. 右键单击 HelloWorldProcessWSDLWrapper.wsdl 节点,然后从弹出菜单中选择 Add Property Alias。
将出现 Create New Property Alias 对话框。
注意:您需要指定属性、消息部分和查询才能创建属性别名。指定的属性用于存储提取的相关标记,消息部分帮助将属性别名映射到某些特定的消息及其部分,查询用于指定需要提取的特定数据。
3. 在 Create New Property Alias 对话框中,单击 Browse。
将出现 Property Chooser 对话框。
4. 展开 HelloWorldProcessWSDLWrapper.wsdl 节点并选择 MyProperty。
5. 单击OK。
6. 在 Create New Property Alias 对话框中,展开 HelloWorldProcessWSDL.wsdl 和 getHelloRequest。
7. 选择 part1 作为消息部分。
8. 在 Query 文本字段中,指定 /UserData/id。
9. 单击 OK。
创建的属性别名将作为子节点添加到 My Property 节点中。
创建第二个属性别名:
1. 在 Navigator 窗口中,展开 Imports。
2. 右键单击 HelloWorldProcessWSDLWrapper.wsdl 节点,然后从弹出菜单中选择 Add Property Alias。
将出现 Create New Property Alias 对话框。
3. 在 Create New Property Alias 对话框中,单击 Browse。
将出现 Property Chooser 对话框。
4. 展开 HelloWorldProcessWSDLWrapper.wsdl 节点并选择 MyProperty。
5. 单击 OK。
6. 在 Create New Property Alias 对话框中,展开 HelloWorldProcessWSDL.wsdl 和 setPrefixRequest。
7. 选择 part1 作为消息部分。
8. 在 Query 文本字段中指定 /Prefix/id。
9. 单击 OK。
创建的属性别名将作为子节点添加到 MyProperty 节点中。