Thursday 10 November 2011

05-Mediator and Conditional Service Routing

05-Mediator and Conditional Service Routing

Mediator and Conditional Service Routing

Most often in service orchestration services are exposed and consumed as separately bundled flow rather than having one single long service , the advantage of such a system is many other applications can access same service, In SOA BPM we use Mediator to invoke services and also invoke the based on some conditions some times called conditional routing of services.
Use case : So far, we had student admission process where student enters his admission data from the Web UI and based on business rules which defines a cut off percentage , student’s admission is granted or rejected, rejected applications are written into file system as xml files, however accepted applications are sent to Admin officer for approval, later on Approved student data is written into Database .
Now, lets have different service for students who belong to “OBC” reservation category, this new service basically writes into a file system in real life it can be pretty complex where parents annual income is considered and their cut off percentage is reduced etc. we would use mediator to route approved student data into this service.

Creating a Service

Lets create a simple BPM process , which accepts input as Student Admission Process XSD as defined earlier, this data is written into a file system into /tmp directory. this BPM process exposed as service so that external applications can invoke it.
Create a separate BPM Process “Selected Student Process”

Ensure that Business Objects and Data Objects are created as before using the same  Application Process XSD , check Association drag n drop Student BO

Create a file Adapter Service on the composite and tie this up with the service invocation activity on the BPM Process. Ensure that Association is selected and properly mapped to Business Object

Using Mediator for Service Invocation and Routing

Drag n drop a web service adapter on composite

Save All .. , This is how the composite would look like now

Drag n drop Mediator component, define service later

You can select WSDL option on this Mediator and select the wsdl url of the service we had defined earlier
http://soabpm-vm:8001/soa-infra/services/default/StudentAdmissionProject/StudentAdmissionProcess.service?WSDL

Connect the Mediator to Web Service Adapter

You would need a transformation to be created on the mediator

We would add routing rules to filter on Reservation category = “OBC”
$in.parameters/tns:operation/tns6:process/tns6:StudentApplicationRequest/tns6:resevationCategory = ‘OBC’

Now open the BPM Process, and add the service invocation for mediator and use data association

Now this is how the composite would look like , the Mediator is connected to BPM Process as well as WSDL Service

This is how the Final BPM process would look like

Running Application

Since Service can be invoked from the Web Front End or go to Enterprise Manager and test the service

Login to BPM workspace as jstein and Approve the student request ( Note : Since student got above 70% Business rule as sent this application for approval)

You can now login to Enterprise Manager, look into the Process Instance

You can look into flow, follow the green line to see the path executed

Look into Audit Trail , its more interesting also helps to diagnose any faults if there are any

Finally XML file is generated in /tmp folder, as per the Business Process and Mediator Routing rules invoking another service
<?xml version=”1.0″ encoding=”UTF-8″ ?>
<process xmlns:tns6=”http://www.jamessmith.org” xmlns=”http://www.jamessmith.org”>
<tns6:StudentApplicationRequest>
<tns6:firstName>James</tns6:firstName>
<tns6:lastName>Smith</tns6:lastName>
<tns6:age>22</tns6:age>
<tns6:marksPercentage>89</tns6:marksPercentage>
<tns6:resevationCategory>OBC</tns6:resevationCategory>
<tns6:parentsAnnualIncome>1234567.0</tns6:parentsAnnualIncome>
</tns6:StudentApplicationRequest>
</process>

No comments:

Post a Comment

xslt padding with characters call template for left pad and right pad

  Could a call-template be written that took two parameters ?   a string, and a   number) return the string with empty spaces appended t...