Dynamic routing is a kind of Content-based Routing pattern, which is used when the BusinessService/ProxyService path is required to be determined at run time, an alternative to Static Routing, which is used when the BusinessService/ProxyService path is established during design time.
The core of this feature is built on the following XML element:
<ctx:route>
<ctx:service isProxy=”true|false”>{$proxy|$businessService}</ctx:service>
<!– Optional : –>
<ctx:operation>{$operationName}</ctx:operation>
</ctx:route>
The isProxy is true or false according to whether the dynamic route is to a Proxy Service or to a Business Service respectively.
Operation is an optional element and is used when you want to invoke a particular operation of a multi-operation ProxyService.
Note: The text inside the Expression tab is a string literal. Any XQuery expressions must be wrapped by braces {}.
The above element in the expression of a dynamic routing action inside a route node, etc. looks like this when executed:
BS:
<ctx:route>
<ctx:service isProxy="false">ServiceCalloutTest/BusinessService1</ctx:service>
</ctx:route>
Note: The text inside the Expression tab is a string literal. Any XQuery expressions must be wrapped by braces {}.
The above element in the expression of a dynamic routing action inside a route node, etc. looks like this when executed:
BS:
<ctx:route>
<ctx:service isProxy="false">ServiceCalloutTest/BusinessService1</ctx:service>
</ctx:route>
PS:
<ctx:route>
<ctx:service isProxy="true">ServiceCalloutTest/ProxyService1</ctx:service>
<ctx:service isProxy="true">ServiceCalloutTest/ProxyService1</ctx:service>
<ctx:operation>initiate</ctx:operation>
</ctx:route>
Now say based on some field element in the input or some variable value you fetch within your pipeline you want to route to a BS or a PS.
Your element variable assume here is alias which can have values say US, IND at runtime based on which you route to the service.
We will create RoutingTable variable on that basis like below using an assign activity.
<Services>
<Service>
<alias>US</alias>
<physical>ServiceCalloutTest/BusinessService1</physical>
</Service>
<Service>
<alias>IND</alias>
<physical>ServiceCalloutTest/BusinessService2</physical>
</Service>
</Services>
So finally in your Dynamic Routing activity below is the expression:
<ctx:route>
<ctx:service isProxy='false'>{$RoutingTable/Service[alias/text()=$alias]/physical/text()} </ctx:service>
</ctx:route>
In the request pipleline you can add activities for process the body/header etc based on what you need to send to the endpoint service
Save and activate your service and Test to verify if working as expected.
Helpful? Comment
Happy Learning.
</ctx:route>
Now say based on some field element in the input or some variable value you fetch within your pipeline you want to route to a BS or a PS.
Your element variable assume here is alias which can have values say US, IND at runtime based on which you route to the service.
We will create RoutingTable variable on that basis like below using an assign activity.
<Services>
<Service>
<alias>US</alias>
<physical>ServiceCalloutTest/BusinessService1</physical>
</Service>
<Service>
<alias>IND</alias>
<physical>ServiceCalloutTest/BusinessService2</physical>
</Service>
</Services>
So finally in your Dynamic Routing activity below is the expression:
<ctx:route>
<ctx:service isProxy='false'>{$RoutingTable/Service[alias/text()=$alias]/physical/text()} </ctx:service>
</ctx:route>
In the request pipleline you can add activities for process the body/header etc based on what you need to send to the endpoint service
Save and activate your service and Test to verify if working as expected.
Helpful? Comment
Happy Learning.