2011年6月4日星期六

OSB_013:OSB 11g 开发指南之三:使用Direct Binding 完美集成SOA和OSB

到目前为止Oracle SOA上的应用和OSB上的应用运转一切正常。但是追求完美的心是每个优秀开发者所必须具备的素质。
他们自己提出了更高的要求:服务除了可以正确的调用之外,还应该能够传播安全和事务的上下文。
这是一项艰巨的工作,需要你对WebService 安全和事务的协议有深刻了解,不过那是在Direct Binding出现以前,呵呵,说话大喘气啊。
在Oracle 推出SOA Suite 11g PS2以后,有了Direct Binding,这个问题变得不能再简单了。
Direct Binding允许通过RMI调用SOA 组件,而我们知道RMI是支持安全和事务的上下文传播的。

1. 从OSB调用SOA
POProsssing 目前的访问方式是HTTP Binding,为了避免大的逻辑改动,我们先做一个小的实验验证:
金额<$1000的订单将通过Direct Binding调用POProcessing,金额>$1000的订单仍然按原来方式调用。

设计改造如下:


重要步骤说明:
1.1 在JDevloper中,修改POProcessing,增加receivePODirect Service。
拖放Direct Binding到Service栏。


1.2 在OSB上,根据receivePODirect WSDL创建Resource、Business/Proxy Service
增加receivePODirect Business Service,注意Transport Protocol为soa-direct:


修改原来的Proxy Service的路由规则,使用XQuery实现,脚本如下:
let $total := $body/ord:PurchaseOrder/ord:price * $body/ord:PurchaseOrder/ord:quantity
return
<ctx:route>
{
<ctx:service isProxy="false">
{
if ($total < 1000)
then "POProcessing/BusinessServices/receivePODirect"
else "POProcessing/BusinessServices/receivePO"
}
</ctx:service>,
<ctx:operation>execute</ctx:operation>
}
</ctx:route>

1.3 测试两个用例。
(1)小订单,如果在EM中看到实例的POProcessing的入口是receivePODirect,即宣告Direct Binding成功!
(2)大订单,仍然走的是receiveDirect,说明路由规则修改成功!

2. 从SOA调用OSB
信用卡验证服务目前的访问方式是HTTP Binding,该服务配置在OSB上,为了避免大的逻辑改动,我们先做一个小的实验验证:
卡号为1234-1234-1234-1234使用Direct Binding调用信用卡验证服务,其他卡号仍然按原来方式调用。

设计改造如下:


重要步骤说明:
2.1 在OSB中,修改Credit Service。
根据已有的Business Service,创建ValidateCredit_SB Proxy Service,注意Transport Protocol为sb:


2.2 在JDeveloper中,增加Direct Binding reference,指向ValidateCredit_SB Proxy Service。
拖放Direct Binding到Reference栏,其WSDL指向ValidateCredit_SB。


连接ApproveLargeOrder和DirectGetCCStatus:


修改ApproveLargeOrder中,调用Credit Card Service逻辑:


2.3 测试两个用例。
(1)大订单,订单号为1234-1234-1234-1234,如果在EM中看到实例的POProcessing调用了DirectGetCCStatus,即宣告Direct Binding成功!
(2)大订单,订单号为其他值,仍然走的是getCreditCardStatus,说明ApproveLargeOrder 修改成功!

没有评论: