This section explains, through an example scenario, how the Command Message EIP can be implemented using the WSO2 ESB. The following topics are covered:
Introduction to Command Message
The Command Message EIP allows you to use messaging, to invoke a procedure in another application. For more information, see http://www.eaipatterns.com/CommandMessage.html.
Figure 1: Command Message EIP
Example scenario
This example demonstrates how the ESB uses messaging to invoke the functionality provided by an application. A command message can be in any form, including a JMS serialized object or a text message in the form of an XML or SOAP request. In this example, the ESB will pass the message as a document to a sample Axis2 server and invoke the operation directly using the Callout mediator.
The following diagram depicts how this example can be simulated using the ESB:
Figure 2: Example scenario of the Command Message EIP
Before digging into implementation details, let's take a look at the relationship between the example scenario and the Command Message EIP by comparing their core components.
Command Message EIP (Figure 1) | Command Message Example Scenario (Figure 2) |
---|---|
Sender | Stock Quote Client |
Command Message | Callout mediator |
Receiver | Stock Quote Service |
The ESB configuration
Given below is the ESB configuration for simulating the example scenario explained above.
<?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="http://ws.apache.org/ns/synapse"> <proxy name="command-message-proxy" startOnLoad="true" transports="http https"> <target> <inSequence> <callout serviceURL="http://localhost:9000/services/SimpleStockQuoteService" action="urn:getQuote"> <source xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:s12="http://www.w3.org/2003/05/soap-envelope" xpath="s11:Body/child::*[fn:position()=1] | s12:Body/child::*[fn:position()=1]" /> <target xmlns:s11="http://schemas.xmlsoap.org/soap/envelope/" xmlns:s12="http://www.w3.org/2003/05/soap-envelope" xpath="s11:Body/child::*[fn:position()=1] | s12:Body/child::*[fn:position()=1]" /> </callout> <respond /> </inSequence> <outSequence> <respond /> </outSequence> </target> </proxy> </definitions>
The configuration elements
The elements used in the above ESB configuration are explained below.
<callout>
- The callout mediator specifies a particular method to invoke in the back-end service. This invocation is blocking.<source>
- The source specifies the payload for the method invocation using xPath expressions.<target>
- The target specifies the location where the response should be concatenated.
Simulating the example scenario
Now, let's try out the example scenario explained above.
Setting up the environment
You need to set up the ESB, and the back-end service:
- Download the
Command-Message_1.0.0.zip
file, which includes the ESB configuration described above. - See Setting up the Environment for instructions on setting up the ESB and the back-end service.
Executing the sample
Let's send a request to the ESB using the Stock Quote Client application. Find out more about the Stock Quote Client from the ESB documentation.
- Open a new terminal, and navigate to the
<ESB_HOME>/samples/axis2Client/
directory. The Stock Quote client application is stored in this directory. Execute the following command to send the request to the ESB.
ant stockquote -Dtrpurl=http://localhost:8280/services/command-message-proxy
Analyzing the output
When you execute the command above, the ESB first receives the message and then routes it to the back-end service (StockQuoteService). The following output will be printed on the Axis2 server's console:
samples.services.SimpleStockQuoteService :: Generating quote for : IBM
The generated stock quote will then be sent to the client application (Stock Quote Client). The following output will be printed on the client application's console:
Standard :: Stock price = $85.09378162206208