我们正设计一套针对电信供应商的新系统,并且锁定Oracle服务总线(OSB)作为企业服务总线。对我来说这款工具的最好的加分项就是强大的工具支持。Oracle已经将其所有企业集成软件栈集成为一个整体,将其捆绑为Oracle SOA套件。本文将把重点放在Oracle SOA套件11g的一部分,Oracle OSB 11g上。Oracle SOA Suite 12c有很大的变化。然而ORacle 12C套件中我喜欢的新功能是开发人员可以在一个IDE(集成开发环境)里,用JDeveloper开发BPEL(业务流程执行语言)以及开发OSB代码。
关于 OSB 需要注意的几点如下:
代理服务: 正如其名字所表明的,代理服务是为外部客户提供的服务,扮演了内部服务外观的角色。通过代理服务,你可以更好地控制内部服务中的变化,因为如果你的内部服务发生变化,代理服务可以执行需要的转换。业务服务: 在 OSB中, 业务服务表示内部应用服务。它可以是 WebService, JMS 队列/主题, REST 服务, FTP 服务以及其他服务. 业务服务将会包含调用实际服务的功能。所以本文中关注的场景如下:
我们有一个内部的服务,回报用户信息,如果用户通过在MSISDN或SIM卡号码,根据输入,数据将被取回来。通过使用代理服务,这项服务必须以更有意义的方式开放给外部方。演示项目可以在这里下载。
首先创建企业服务,作为内部服务的表面。 在OSB项目中,创建四个文件夹:
代理业务转换WSDL然后需要复制本例中的 内部服务WSDL和代理服务 WSDL文件到 “WSDL” 文件夹。
配置企业服务
右击 “business” 文件夹,并选择 New->Business服务。当企业服务创建好,“General” 选项卡弹出。在此,我们需要做如下操作:
选择 “WSDL Web Service” ,然后点击浏览器。 然后选择“Browse,” 选择 the WSDL file,然后有两个选项。选择the one ending with “(port)然后到“Transport” 选项卡,并且将 URI改为:: http://localhost:8088/mockInstalledBaseSubscriberClassificationQueryWSServiceSoapBinding. 这是因为我们将使用SOAPUI 模拟服务特征来测试, URI 代表由WSDL表示的SOAPUI的模拟服务端点。本例中的SOAPUI项目可以在此下载。这就是我们配置业务服务所需要做的所有操作。然后进入我们的代理服务,这是所有的动作发生的地方。
配置代理服务右键点击创建的 “proxy” 目录, 选择 New->Proxy Service 并提供一个有效的名称.在 “General” 标签页, 选择 “WSDL Web Service” 并点击浏览.现在代理服务中,你需要选择我们创建的代理 WSDL 文件,该文件会提供给外部客户端。
进入 “Message Flow” 标签页. 在该标签页, 首先由右侧的 “Design Palette” 中拖拽一个 “Route” 元素.然后,拖拽一个 “Routing” 元素到 “Route” 元素中.点击 “Routing” 元素, 并在底部面板中, 进入 “Properties” 标签页, 在该标签页中你将提供代理服务将会访问的业务服务与操作名称.结果如下:
然后拖拽一个 “Replace” 到 “Request Action” 组件.在 “Properties” 标签页为 “Replace” 动作提供信息之前, 我们需要创建 XQuery 转换文件, 该文件会将代理服务映射为业务服务请求,然后将业务服务响应映射回代理服务响应.右键点击 “transformation” 目录并选择 New->XQuery Transformation. 输入有效名称. 对请求与响应转换文件也需要进行同样的操作。所用的请求转换文件如下:(:: pragma bea:global-element-parameter parameter="$fetchSubscriber1" element="ns2:FetchSubscriber" location="../wsdl/SubscriberProxyService.wsdl" ::)(:: pragma bea:local-element-return type="ns1:InstalledBaseSubscriberClassificationQuery/ns0:InstalledBaseSubscriberClassificationQuery" location="../wsdl/subscriber_classfication.wsdl" ::)declare namespace ns2 = "http://www.example.org/SubscriberProxyService/";declare namespace ns1 = "http://www.openuri.org/";declare namespace ns0 = "http://mtnsa.co.za/si/IB/IBSubscriberClassificationQuery";declare namespace xf = "http://tempuri.org/OSB%20training%201/transformation/subscriberrequest/";declare function xf:subscriberrequest($fetchSubscriber1 as element(ns2:FetchSubscriber)) as element() { <ns1:InstalledBaseSubscriberClassificationQuery> <ns0:InstalledBaseSubscriberClassificationQuery> <ns0:Request> { if (data($fetchSubscriber1/EquipmentType) = "MSISDN") then <ns0:MSISDN> { (data($fetchSubscriber1/EquipmentValue))}</ns0:MSISDN> else <ns0:SIMCard> { data($fetchSubscriber1/EquipmentValue)}</ns0:SIMCard> } </ns0:Request> </ns0:InstalledBaseSubscriberClassificationQuery> </ns1:InstalledBaseSubscriberClassificationQuery>};declare variable $fetchSubscriber1 as element(ns2:FetchSubscriber) external;xf:subscriberrequest($fetchSubscriber1)
在这里正如你所看到的,我们检测设备类型是否等 “MSISDN” ,然后在业务服务中设置相应的元素。
所用的响应转换文件如下:(:: pragma bea:global-element-parameter parameter="$installedBaseSubscriberClassificationQueryResponse1" element="ns1:InstalledBaseSubscriberClassificationQueryResponse" location="../wsdl/subscriber_classfication.wsdl" ::)(:: pragma bea:global-element-return element="ns2:FetchSubscriberResponse" location="../wsdl/SubscriberProxyService.wsdl" ::)declare namespace ns2 = "http://www.example.org/SubscriberProxyService/";declare namespace ns1 = "http://www.openuri.org/";declare namespace ns0 = "http://mtnsa.co.za/si/IB/IBSubscriberClassificationQuery";declare namespace xf = "http://tempuri.org/OSB%20training%201/transformation/subscriberresponse/";declare function xf:subscriberresponse($installedBaseSubscriberClassificationQueryResponse1 as element(ns1:InstalledBaseSubscriberClassificationQueryResponse)) as element(ns2:FetchSubscriberResponse) { <ns2:FetchSubscriberResponse> <TradeCustomerCode>{ data($installedBaseSubscriberClassificationQueryResponse1/ns0:InstalledBaseSubscriberClassificationQuery/ns0:Response/ns0:Subscriber/@ServiceProviderCode) }</TradeCustomerCode> <PackageCode>{ data($installedBaseSubscriberClassificationQueryResponse1/ns0:InstalledBaseSubscriberClassificationQuery/ns0:Response/ns0:Subscriber/ns0:Package/@ProductCode) }</PackageCode> <PaymentOption>{ data($installedBaseSubscriberClassificationQueryResponse1/ns0:InstalledBaseSubscriberClassificationQuery/ns0:Response/ns0:Subscriber/@PaymentOption) }</PaymentOption> </ns2:FetchSubscriberResponse>};declare variable $installedBaseSubscriberClassificationQueryResponse1 as element(ns1:InstalledBaseSubscriberClassificationQueryResponse) external;xf:subscriberresponse($installedBaseSubscriberClassificationQueryResponse1)
这是一个简单的转换,在其中我们将响应元素映射到所需的代理响应元素。
现在我们回到代理服务,点击 “Replace” 动作,进入 “Properties” 标签页.
在 “In Variable” 中插入值 “body”.点击 “Expression” 链接. 进入 “XQuery Resources” 标签页, 点击 “Browse” 并选择请求转换文件.在右侧的 “Variable Structures” 组件中,展开 “body” 元素,然后选择请求元素并将其拖拽到 “Binding” 文本框中,如下所示:text box as follows:然后选择 “OK” 从而会将你带回 “Properties” 标签.选择以 “Replace node contents” 单选按钮. 结果如下所示:现在让我们拖拽一个 “Replace” 动作到 “Response Action” 组件.与之前相同,选择响应转换“$body/ins:InstalledBaseSubscriberClassificationQueryResponse”.你会遇到一个错误,表明 “ins” 命名空间没有被识别.为解决该错误,在同一个 “Properties” 标签内, 选择标签 “Namespaces” 并点击添加. 输入 “ins” 作为前缀, “http://www.openuri.org/” 作为 URI.就是这样,现在我们就可以测试该功能。 在你动手之前,请记住首先启动在SOAP UI上创建的模拟服务。
现在,我们登录服务总线控制台,转到代理服务并启动测试控制台。 下面是过运行示例得到的结果:
你以在“ Invocation Trace”部分中的同一个屏幕上进一步了解发生的详细过程。 OSB进行的请求和响应转换可以在下面的图片中看到:
到这里我们将结束对Oracle Service Bus的介绍。 如果你有任何疑问,请随时留言,我将尽快回复。 另外,如果有任何改善的地方,请留下你的反馈,我们将一如既往的非常感谢。
- 蜜度索骥:以跨模态检索技术助力“企宣”向上生长
- 央国企采购管理升级,合合信息旗下启信慧眼以科技破局难点
- Apache Struts重大漏洞被黑客利用,远程代码执行风险加剧
- Crunchbase:2024年AI网络安全行业风险投资超过26亿美元
- 调查报告:AI与云重塑IT格局,77%的IT领导者视网络安全为首要挑战
- 长江存储发布声明:从无“借壳上市”意愿
- 泛微·数智大脑Xiaoe.AI正式发布,千人现场体验数智化运营场景
- IDC:2024年第三季度北美IT分销商收入增长至202亿美元
- AI成为双刃剑!凯捷调查:97%组织遭遇过GenAI漏洞攻击
- openEuler开源五年树立新里程碑,累计装机量突破1000万
- 创想 华彩新程!2024柯尼卡美能达媒体沟通会焕新增长之道
免责声明:本网站内容主要来自原创、合作伙伴供稿和第三方自媒体作者投稿,凡在本网站出现的信息,均仅供参考。本网站将尽力确保所提供信息的准确性及可靠性,但不保证有关资料的准确性及可靠性,读者在使用前请进一步核实,并对任何自主决定的行为负责。本网站对有关资料所引致的错误、不确或遗漏,概不负任何法律责任。任何单位或个人认为本网站中的网页或链接内容可能涉嫌侵犯其知识产权或存在不实内容时,应及时向本网站提出书面权利通知或不实情况说明,并提供身份证明、权属证明及详细侵权或不实情况证明。本网站在收到上述法律文件后,将会依法尽快联系相关文章源头核实,沟通删除相关内容或断开相关链接。