This section explains, through an example scenario, how the Scatter-Gather EIP can be implemented using WSO2 ESB. The following topics are covered:
Table of Contents |
---|
...
This example scenario demonstrates an implementation of Scatter-Gather EIP , which that broadcasts a message to multiple recipients , using WSO2 ESB. The ESB uses an Aggregator the Aggregate mediator to collect the responses and distill merge them into a single response message.
We use a sample Stock Quote service as the service provided by the vendors. In this scenario, you send a quote request to 3 three vendors, get quotes for certain items, and return the best quote to the client. We assume that all 3 three vendors implement the same service contract. If the service contracts are different, appropriate transformations must be done the ESB must transform the messages before sending the requests them to the vendor services , and then transform the responses backbefore returning them to the client. The XSLT mediator can be used to do that is designed to handle these transformations.
The diagram below depicts how to simulate the example scenario using the WSO2 ESB.
Figure 2: Scatter-Gather Example Scenario
Before digging into implementation details, let's take a look at the relationship between the example scenario and the Scatter-Gather EIP by comparing their core components.
Figure 1: Scatter-Gather EIP Figure 2: (Figure 1) | Scatter-Gather Example Scenario (Figure 2) |
---|---|
Quote Request | Simple Stock Quote Request |
Broadcast | |
Quote | Simple Stock Quote Service Response |
Aggregator | Aggregate Mediator |
Best Quote | Aggregated Response |
Environment setup
- Download an and install the WSO2 ESB from http://wso2.com/products/enterprise-service-bus. For a list of prerequisites and step-by-step installation instructions, refer to Getting Started in the WSO2 ESB documentation.
- Start three sample Axis2 server instances on ports 9000, 9001, and 9002. For instructions, refer to the section ESB Samples Setup - Starting Sample Back-End Services in the WSO2 ESB documentation.
...
Start the ESB server and log into its management console UI (https:
//localhost:9443/carbon
). In the management console, navigate to Main Menu, click Services, then Add and then click Proxy Service. Next, copy and paste the following configuration, which helps you explore the example scenario, to a new Pass Through Proxy Service named ScatterGatherProxy. Anchor step3 step3
...
Simulating the sample scenario
Use a SOAP client like
SOAP UI SoapUI to send the following request to the
ScatterGatherProxy
service.Code Block language html/xml <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://services.samples"> <soapenv:Header/> <soapenv:Body> <ser:getSimpleQuote> <ser:symbol>Foo</ser:symbol> </ser:getSimpleQuote> </soapenv:Body> </soapenv:Envelope>
Since - Because the log mediator is enabled inside the outSequence, there will be 3
- three responses from the 3
- three vendors. The logs will be similar to the following:
- In SOAP UI
- SoapUI, you will get the response from the vendor providing the best quote as follows:
- Compare the logged response messages with the response received by the client shows
- to see that the
ScatterGatherProxy
service returns the best quote to the client (soapUI) - .
How the implementation works
Let's investigate the elements of the ESB configuration in detail. The line numbers below are mapped with the ESB configuration illustrated in step 3 shown above.
- clone [line 6 in ESB config] - The Clone mediator is similar to the Splitter EIP. It clones the incoming request and passes the requests parallelly in parallel to several endpoints.
- aggregate [line 26 in ESB config] - The Aggregate mediator aggregates response messages for requests made by the Iterate or Clone mediators mediator. The completion condition specifies the minimum or maximum number of messages to be collected. When all messages are aggregated, the sequence inside
onComplete
will be run. - In the
inSequence
of theScatterGatherProxy
service, we are simply cloning, or making 3 use the Clone mediator to make three copies of the request to be sent by the client using the Clone mediator. Those requests are then forwarded to the 3 three vendor services (SimpleStockeQuoteService
). The responses to those 3 three requests are received at theoutSequence
. - All received responses are logged before aggregating, using the the Aggregate mediator of the ESB merges them. The
onComplete
sequence of the the Aggregate mediator is called once all 3 three responses are received or the specified completion condition is met. The responses are aggregated based on the value of thereturn
element in the response. - Next, the The Enrich mediator is used to extract the response, which contains the best quote. The following XPath 1.0 expression is used for this purpose:
//m0:return[not(preceding-sibling::m0:return/m1:last <= m1:last) and not(following-sibling::m0:return/m1:last < m1:last)]
In essence, this message instructs the ESB to pick the response
...
- that has the lowest
last
value.
...
- (The XPath 2.0
min
function
...
- could reduce the complexity of the above command
...
- , but XPath 1.0 is the current default supported by WSO2 ESB
...
- .
...
- ) Once the proper response is found, we enrich the SOAP body with it and send that response back to the client
...
- .