About the Coordinated Request Reply sample

The Coordinated Request Reply sample is a message flow sample application based on the scenario of a contemporary and established application communicating through the use of WebSphere MQ messages in a request/reply processing pattern.  The contemporary application uses self-defining XML messages and issues a request message.  The established application uses Custom Wire Format (CWF) messages.  It receives a request message, processes it and delivers a reply message.  For the applications to successfully communicate, the message formats must be transformed for both the request and reply messages.

The sample demonstrates how conversion can be achieved between self-defining XML messages and CWF messages.  In addition the sample demonstrates how it is possible to store information in one message flow and retrieve it in another.  In the sample there is a need to preserve the ReplyToQ and ReplyToQMgr from the initial request message for use when the corresponding reply message is received.  In the scenario a WebSphere MQ message is used to store the details.

The processing in the sample consists of three message flows and one message set.  The message flows are:

The message set Sample MSET with message definition SaleListMessage is used in the conversion of the message from XML format to CWF on the request section of the processing, and in the conversion from CWF to XML on the reply section of the processing.

The details of the message flows and the processing they perform is described below.

Request message flow

The request message flow performs the following processing:

The Request message flow consists of the following nodes:

The Request message flow

The MQInput node GetRequestMsg reads the XML message. As the incoming message is in a self-defining XML format there is no need to specify a message set or format for it to be parsed successfully.

The subflow StoreOriginalMQMD_Sub encapsulates the storage of the ReplyToQ and ReplyToQMgr values in a WebSphere MQ message.  This encapsulation is done for two reasons:  Firstly to allow the processing logic to be easily reused in other message flows and secondly to allow alternative implementations to be substituted.  For example an alternative implementation that uses a database node could be created.

The Compute node TransformAndSetReplyTo performs the following actions:

  1. Copies the message headers from the input message to the output message tree.
  2. Performs the conversion of the input message from XML format to CWF. 
  3. Sets the message set, type, and format for the output message.
  4. Sets the ReplyToQ for the new message to be that of the input queue for the reply message flow.

The MQReply node OutputRequestMsg writes the WebSphere MQ output message.

Backend Reply message flow

The backend reply message flows performs the following processing:

  1. Reads a WebSphere MQ message.
  2. Adds the time the message was modified to the payload of the message.
  3. Writes a WebSphere MQ message.

The Backend Reply message flow consists of the following nodes:

The Backend Reply message flow

The MQInput node GetRequestMsg reads the CWF message. The message set, format, and domain that are needed to parse the incoming message are specified on the MQInput node.

The compute node Backend_Computation performs the following actions:

  1. Copies the entire input message to the output message tree.
  2. Obtains the current time from Message Broker and reformats it.
  3. Adds the reformatted time to the output message tree.

The MQReply node PutReplyMsg writes the WebSphere MQ output message.

Reply message flow

The reply message flow performs the following processing:

  1. Reads a WebSphere MQ message containing a message in CWF format.
  2. Converts the message into the equivalent XML format.
  3. Obtains the ReplyToQ and ReplyToQ Mgr of the original request message by reading the WebSphere MQ message which was used to store this information in the Request message flow.  This is done by using the MQGet node.
  4. Creates a WebSphere MQ message containing the transformed message and the retrieved ReplyToQ and ReplyToQMgr values.

The Reply message flow consists of the following nodes:

The Reply message flow

The MQInput node GetBackendReply reads the CWF message. The message set, format, and domain that are needed to parse the incoming message are specified on the MQInput node.

The compute node MapToRequestor performs the following actions:

  1. Copies the message headers from the input message to the output message tree.
  2. Performs the conversion of the input message from CWF format to XML.

The subflow RestoreOriginalMQMD_Sub encapsulates the retrieval of the ReplyToQ and ReplyToQMgr values. It reads the WebSphere MQ message containing the values of ReplyToQ and ReplyToQMgr that were specified in the original request message and copies them into the reply message.  It does the read by using the MQGet node.  The MQGet node is configured to select the corresponding message by CorrelId and to copy the original request MQMD into the MQMD of the message being processed.  This is done to direct the reply message from the established application to the correct requester application. The MQGet node also retrieves the payload of the WebSphere MQ message which was used to store the original values of ReplyToQ and ReplyToQMgr.

The MQReply node PutOriginalReply writes the WebSphere MQ output message.

Test message

The test message used in the coordinated request reply sample is a simple XML message that contains invoice details for a customer.  During the execution of the sample this XML message is converted into the CWF format.  The CompletionTime field value is the only value to change during the execution of the sample.  The message is shown below.

<SaleEnvelope>
<Header>
<SaleListCount>1</SaleListCount>
</Header>
<SaleList>
<Invoice>
<Initial>K</Initial>
<Initial>A</Initial>
<Surname>Braithwaite</Surname>
<Item>
<Code>00</Code>
<Code>01</Code>
<Code>02</Code>
<Description>Twister</Description>
<Category>Games</Category>
<Price>00.30</Price>
<Quantity>01</Quantity>
</Item>
<Item>
<Code>02</Code>
<Code>03</Code>
<Code>01</Code>
<Description>The Times Newspaper</Description>
<Category>Books and Media</Category>
<Price>00.20</Price>
<Quantity>01</Quantity>
</Item>
<Balance>00.50</Balance>
<Currency>Sterling</Currency>
</Invoice>
<Invoice>
<Initial>T</Initial>
<Initial>J</Initial>
<Surname>Dunnwin</Surname>
<Item>
<Code>04</Code>
<Code>05</Code>
<Code>01</Code>
<Description>The Origin of Species</Description>
<Category>Books and Media</Category>
<Price>22.34</Price>
<Quantity>02</Quantity>
</Item>
<Item>
<Code>06</Code>
<Code>07</Code>
<Code>01</Code>
<Description>Microscope</Description>
<Category>Miscellaneous</Category>
<Price>36.20</Price>
<Quantity>01</Quantity>
</Item>
<Balance>81.84</Balance>
<Currency>Euros</Currency>
</Invoice>
</SaleList>
<Trailer>
<CompletionTime>12.00.00</CompletionTime>
</Trailer>
</SaleEnvelope>

Back to sample home