Couple of main components one needs to be aware of with the OSB is as follows;
Proxy Service
A proxy service as its name implies, is a service that is hosted to the external parties which acts as a facade for an internal service. By having a proxy service, you have more control over the changes in your internal services as the proxy service can do the required transformations if your internal services ever change.
Business Service
A business service, in terms of the OSB, represents an internal application service. It can be a WebService, JMS queue/topic, REST service, FTP service and many more. The business service will encompass the functionality to call the actual service.
So the scenario we will focus on this article is as follows;
- We have an internal service that returns subscriber information if the user passes in either the MSISDN or the SIM Card number and depending on the input, data will be fetched and returned.
- This service will have to be exposed to the external party in a more meaningful manner by making use of a proxy service.
The sample project can be downloaded here.
First of all, we create the business service which will act as the facade to our internal service. In your OSB project, create the following four folders;
- proxy
- business
- transformation
- wsdl
Then we need to copy the internal service WSDL and the proxy service WSDL created for this example into the “wsdl” folder.
Configuring the business service
Right click on the “business” folder and select New->Business Service. When the business service is created, you will then first be presented with the “General” tab. In this we do the following;
- Select “WSDL Web Service” and click on browser. Then select “Browse”, select the WSDL file and you will be presented with two options. Select the one ending with “(port).
- Then go the “Transport” tab and change the URI as http://localhost:8088/mockInstalledBaseSubscriberClassificationQueryWSServiceSoapBinding. This is because we will use the SOAPUI mock service feature to test this out and the URI represents the mock service endpoint of SOAPUI for the service represented by the WSDL.
- The SOAPUI project use for this example can be downloaded from here.
That is all we need to do to configure our business service. Then we move onto our proxy service where all the action takes place.
Configuring the proxy service
- Right click on the “proxy” folder created, select New->Proxy Service and provide a valid name.
- In the “General” tab, select “WSDL Web Service” and click on browse.
- Now in the proxy service, you need to select the proxy WSDL file we have created which will be exposed to the external clients.
- Go to the “Message Flow” tab. In that tab, first drag a “Route” element from the “Design Palette” on the right side.
- Afterwards, drag a “Routing” element into the “Route” element.
- Click on the “Routing” element and in the bottom pane, go into the “Properties” tab where you will provide the business service that this proxy service will access and the operation name.
- The result will be as follows;
- Then drag a “Replace” action into the “Request Action” component.
- Before we provide the information on the “Properties” tab for the “Replace” action, we need to create the XQuery transformation files which will map the proxy service request to the business service request and then the business service response back to the proxy service response.
- Right click on the “transformation” folder and select New->XQuery Transformation. Enter a valid name. This should be done for both the request and response transformation files.
- The request transformation file used is as follows;
(:: 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)Here as you can see, we check if the equipment type is equal to “MSISDN” and then set the appropriate element on the business service.
- The response transformation file used is as follows;
(:: 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)This is a simple transformation where we map the response elements to the proxy response elements as required.
- In the “In Variable” insert the value “body”.
- Click on the “Expression” link. Go to the “XQuery Resources” tab, click on “Browse” and select the request transformation file.
- In the “Variable Structures” component on the right side, expand the “body” element, and then select the request element and drag and drop it into the “Binding” text box as follows;
- Then select “OK” which will take you back to the “Properties” tab.
- Select “Replace node contents” radio button. The end result will look as follows;
- Now let us drag and drop a “Replace” action to the “Response Action” component.
- Same as before, select the response transformation “$body/ins:InstalledBaseSubscriberClassificationQueryResponse”.
- You will now get an error stating that the “ins” namespace is not recognized.
- In order to resolve that, in the same “Properties” tab, select the tab “Namespaces” and click on add. Enter the prefix as “ins” and the URI as “http://www.openuri.org/”.
Now let us log into the service bus console, go to the proxy service and launch the test console. This is the result that I got by running a sample;
You can see a trace of what exactly happened if you go further down on the same screen within the “Invocation Trace” section. The request and response transformation done by the OSB can be seen as follows;
That ends our introduction to the Oracle Service Bus. If you do have any queries on the same, please do not hesitate to leave a comment by and I will respond to it as soon as possible. Also, if there are any areas of improvement you may see, kindly leave your feedback as well which is always much appreciated.
Hi Rick,
ReplyDeleteThank you for the kind comment. Much appreciated.
Regards,
Dinuka