2011年5月13日星期五

SOASuite_025:SOA Suite 11g 开发指南之四:使用BPEL编排订单处理流程

开发与运行环境:JDeveloper 11.1.1.5.0 + SOA Suite 11.1.1.5.0

接着上一个实验,我们增加了以下功能:
当订单金额<$1000时,直接把订单内容写到文件里。
当订单金额>$1000时,验证用户的信用卡,并根据返回值,设置订单的状态。

SOA 应用设计如下:

重要步骤说明:

1. 增加External References:CreditCardStatus 
(1)在查找已经发布的服务时,比如validationForCC服务,可以从SOA Server上直接查找,如下图:


或者直接访问EM Console上,找到validationForCC服务的WSDL URL,如下图:


然后复制到WSDL URL一栏。

2. 增加BPEL:approveLargeOrder 

(1)选择Template:Asynchronous BPEL Process,即异步的BPEL。
(2)Expose as a SOAP Service:不勾上,即不对外暴露为公开的WebService。
(3)选择interalorder.xsd的Order作为Input和Output参数类型。
(4)连接approveLargeOrder和CreditCardStatus Reference。
(5)使用Invoke Action
使用Invoke Action调用一个同步服务时,需要创建Invoke的输入和输出参数,一般用默认的变量名即可。
(6)使用Assign Action给Invoke的输入参数赋值
由于Invoke的输入参数和BPEL的输入参数格式不同,比如这里BPEL的输入参数格式是internalorder.xsd,而Invoke的输入参数的格式来自WSDL定义的Schema,因此需要转换。
同时,创建BPEL时会同时创建BPEL的输入参数和输出参数。
这里把BPEL的输入参数直接赋值给BPEL的输出参数,这样保证BPEL返回时输出参数有值。
当然真正的输出参数值不可能完全跟输入参数值一样,后边我们会看到,是如何修改输出参数值的。
最终的转换结果如下图:

(7)得到validationForCC服务的返回值后,使用Assign Action把它赋值给BPEL的输出参数。如下图:


(8)完成BPEL设计后,点击左上角“绿勾”,检查BPEL是否语法正确,警告信息也不要放过。如下图:


3. 修改Mediator
(1)当订单金额<$1000时,直接把订单内容写到文件里。

(2)当订单金额>$1000时,调用approveLargeOrder BPEL。
(3)验证完毕订单金额>$1000的用户信用卡后,结果也要写到文件中,因此要在CallBack中调用WriteApprovalResults服务。如下图:



4. 部署

5. 测试
用订单金额>1000的数据进行测试,会发现验证用户信用卡服务是一个synchronous (request-response) 调用,request-response 同时在payload中可以看到。如下图:

Project 下载:Lab04 POProcessing.7z

没有评论: