旅行社应用
旅行社应用的全部过程按以下顺序进行:
1. 网站使用SOAP请求把用户的预订要求发送到SOAP绑定组件。这个消息就是网站的XML内容。注意,这个交流过程是在JBI外部发生的。
2. 现在开始进入JBI环境。SOAP绑定组件的配置会通过一个消息转换器把这个网站的XML内容发送到“预订工作流程终端”(在BPEL引擎上)。
3. BPEL引擎把网站的XML内容发送到XSLT_1_Endpoint(在XSLT引擎上)。
4. XSLT引擎把网站的XML内容转换为航空服务可以读取的格式,并以航空服务请求XML格式返回。
5. BPEL引擎把网站的XML内容发送到XSLT_2_Endpoint(在XSLT引擎上)。
6. XSLT引擎把网站的XML内容转换为旅店服务可以读取的格式,并以旅店服务请求XML格式返回。
7. BPEL引擎把航空服务请求XML发送到“航空服务终端”,解析为“我的航空公司终端”(在SOAP绑定组件上)。
8. SOAP绑定组件的配置会通过发送一个SOAP请求把航空服务请求XML发送到“我的航空公司”Web服务(在JBI外部);然后得到经过确认的航空服务响应XML,并被返回BPEL引擎。
9. BPEL引擎把旅店服务请求XML发送到“旅店终端”,解析为“我的旅店终端”(在RMI绑定组件上)。
10. RMI绑定组件的配置会以RMI调用的形式把旅店服务请求XML发送到“我的旅店”RMI服务器(在JBI外部);然后得到经过确认的旅店服务响应XML,并被返回BPEL引擎。
11. 根据这两项预订,BPEL引擎把航空服务响应XML和旅店服务响应XML合并为航空/旅店服务响应XML;然后把这个XML发送到XSLT_3_Endpoint(在XSLT引擎上)。
12. XSLT引擎把航空/旅店服务响应XML转换为概述这些预订的文本;然后以邮件XML的格式返回到旅行社工作流引擎。
13. BPEL引擎把邮件XML发送到邮件终端(在邮件绑定引擎上)。
14. 邮件绑定引擎把邮件XML发送给用户(在JBI外部)。过程结束。
组件
应用所需的JBI组件有SOAP绑定组件(与网站和航空公司的Web服务进行通信)、JMS绑定组件(与旅店JMS服务进行通信)、XSLT引擎(XML转换)、邮件引擎(向客户发送确认邮件)和BPEL引擎。这些JBI组件都是用Petals JBI容器进行配置的。
要创建应用,只要把这些组件安装到JBI容器。到此,架构应该是如图7所示的样子:

图7 组件安装后
这里注意,邮件引擎在本地向JBI环境开放它唯一的服务终端,因为它不需要任何配置,并且总是执行同样的任务(实际上就是发送邮件)。
组件安装后,我们必须对它们进行配置。因此,我们要创建能把这些元素连接到一起的服务装配器。服务装配器由以下所述服务单位构成。
网站服务单位
创建一个服务单位部署到SOAP绑定组件上(SOAP BC)。这个服务单位定义了http://travel.com/workflowService的Web服务,并将指向内部的WorkflowEndpoint服务终端。
SOAP BC通过这个服务单位使用WorkflowEndpoint服务终端:
<jbi version="1.0" xmlns='http://java.sun.com/xml/ns/jbi' ...>
<services binding-component="true">
<consumes service-name =" BookingWorkflowService "
endpoint-name =" BookingWorkflowEndpoint " />
<petals:address> http://travel.com/workflowService </petals:address>
</services>
</jbi>
部署服务单位后,SOAP BC开放一个新的Web服务,即http://travel.com/workflowService。当外部有调用该Web服务的命令时(比如从网站),SOAP BC就把它传送到BookingWorkflowEndpoint服务终端,也就是应用的工作流引擎。
预订流程服务单位
这是用来部署到BPEL引擎上的服务单位。这个服务单位包含一个预订流程的BPEL定义,定义列出工作流程引擎必须调用的各种服务终端。这个流程定义是指向内部的BookingWorkflowEndpoint服务终端:
<jbi version="1.0" xmlns='http://java.sun.com/xml/ns/jbi' ...>
<services binding-component="false">
<provides service-name =" BookingWorkflowService "
endpoint-name =" BookingWorkflowEndpoint " />
<petals:address> file://travel-booking.bpel </petals:address>
</services>
</jbi>
预订流程的BPEL文件描述了这个过程并储存在服务单位中。
航空公司Web服务单位
另一个要部署到SOAP BC上的服务单位是航空公司的Web服务单位。这个服务单位定义了将指向外部Web服务http://myairline.com/flightBookingService的MyAirlineCompanyEndpoint。
SOAP BC通过这个服务单位提供MyAirlineCompanyEndpoint:
<jbi version="1.0" xmlns='http://java.sun.com/xml/ns/jbi' …>
<services binding-component="true">
<provides service-name =" MyAirLineCompanyService "
endpoint-name =" MyAirLineCompanyEndpoint " />
<petals:address> http://myairline.com/flightBookingService </petals:address>
</services>
</jbi>
服务单位部署后,SOAP BC将在JBI环境中激活MyAirlineCompanyEndpoint服务终端。如果有JBI组件向这个服务终端发送消息,SOAP BC就将其传送到外部的http://myairline.com/flightBookingService Web服务,也就是航空服务预订的Web服务。
旅店JMS服务单位
旅店JMS服务单位跟航空服务单位相似。JMS BC提供负责向旅店JMS服务器转发消息的MyHotelEndpoint服务终端。
XSLT服务单位
XSLT引擎用于三种转换:
* 把网站的初始XML转换为航空服务请求XML
* 把网站的初始XML转换为旅店服务请求XML
* 把航空/旅店服务响应XML转换为邮件XML
因此,必须有这三个服务单位,并且包含一个正确描述转换的XSL样式表。XSLT引擎将通过三个服务终端提供三种服务。
航空公司与旅店的连接器
如前面所述,我们可以使用各个连接器独立地把应用的工作流引擎连接到航空公司和旅店服务,并且通过部署新的服务装配器动态地配置这些连接。
比如,一个指向MyLowCostAirLineCompany的连接器:
<jbi version="1.0" xmlns…>
<service-assembly>
...
<connections>
<connection>
<consumer service-name ="AirLineService"
endpoint-name ="AirLineServiceEndpoint"/>
<provider service-name ="MyLowCostAirLineCompany"
endpoint-name ="MyLowCostAirLineCompanyEndpoint"/>
</connection>
</connections>
</service-assembly>
</jbi>
根据这段代码,如果有服务使用者(应用的工作流引擎)要使用AirlineService,其真正使用的服务将是MyLowCostAirLine。