Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

This section explains, through an example scenario, how the Command Message EIP can be implemented using the WSO2 ESB. The following topics are covered:

Table of Contents

...

The Command Message EIP allows you to use messaging, to invoke a procedure in another application. For more information, refer to see http://www.eaipatterns.com/CommandMessage.html.

Figure 1: Command Message EIP

Example scenario

This example demonstrates how WSO2 the ESB uses messaging to invoke the functionality provided by an application, in this case a stock quote service. 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 the Callout mediator.

The following diagram below depicts how to simulate the example scenario this example can be simulated using the WSO2 ESB.:

Figure 2: Example Scenario 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)
SenderStock Quote Client
Command MessageCallout
Mediator
mediator
ReceiverStock Quote Service
Instance

Environment setup

  1. Download and install WSO2 ESB from http://wso2.com/products/enterprise-service-bus. For a list of prerequisites and step-by-step installation instructions, refer to Installation Guide in the WSO2 ESB documentation.
  2. Start the sample Axis2 server. For instructions, refer to the section Setting Up the ESB Samples - Starting the Axis2 server in the WSO2 ESB documentation.

ESB configuration

...

The ESB configuration

Given below is the ESB configuration for simulating the example scenario explained above. 

Anchor
step3
step3

Code Block
languagehtml/xml
linenumberstrue
<?xml version="1.0" encoding="UTF-8"?>
<definitions xmlns="http://ws.apache.org/ns/synapse">
   <sequence<proxy name="faultcommand-message-proxy">
      <log level startOnLoad="fulltrue">
         <property name="MESSAGE" value="Executing default &#34;fault&#34; sequence"/ transports="http https">
      <target>
  <property name="ERROR_CODE" expression="get-property('ERROR_CODE')"/>          <property name="ERROR_MESSAGE" expression="get-property('ERROR_MESSAGE')"/><inSequence>
      </log>       <drop/>
   </sequence>
   <sequence name="main">
      <callout serviceURL="http://localhost:9000/services/SimpleStockQuoteService"
               action="urn:getQuote">
         <source xmlns:s12s11="http://wwwschemas.w3xmlsoap.org/2003soap/05envelope/soap-envelope"                  xmlns:s11s12="http://schemaswww.xmlsoapw3.org/2003/05/soap/-envelope/"
                 xpath="s11:Body/child::*[fn:position()=1] | s12:Body/child::*[fn:position()=1]" />
         <target xmlns:s12s11="http://wwwschemas.w3xmlsoap.org/2003soap/05envelope/soap-envelope"
                 xmlns:s11s12="http://schemaswww.xmlsoapw3.org/2003/05/soap/-envelope/"
                 xpath="s11:Body/child::*[fn:position()=1] | s12:Body/child::*[fn:position()=1]" />
      </callout>
      <property name="RESPONSE" value="true"<respond />
       <header name="To" action="remove"/> </inSequence>
         <outSequence>
      <send/>      <respond <drop/>
         </sequence>
</definitions>

Simulating the sample scenario

...

ant stockquote -Dtrpurl=http://localhost:8280

...

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 shown above. 

...

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 [line 13 in ESB config] <source> - The source specifies the payload for the method invocation using xPath expressionsusing xPath expressions
  • target [line 16 in ESB config] <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:

  1. Download the Command-Message_1.0.0.zip file, which includes the ESB configuration described above. 
  2. See Setting up the Environment for instructions on setting up the ESB and the back-end service.

    Info

    When you set up the environment, note that you only need to start one instance of the back-end service (Stock Quote Service) to simulate this example.

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.

  1. Open a new terminal, and navigate to the <ESB_HOME>/samples/axis2Client/ directory. The Stock Quote client application is stored in this directory.
  2. Execute the following command to send the request to the ESB.

    Code Block
    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: 

Code Block
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:

Code Block
Standard :: Stock price = $85.09378162206208