Showing posts with label HTTP Node. Show all posts
Showing posts with label HTTP Node. Show all posts

(WMB) SOAP Vs HTTP Nodes

This post talks about the preferences of using one type of nodes over others. During the course of my experience in using these nodes, I had several confusions regarding when to use what & what is the main difference among these nodes.


We can use SOAP nodes with SOAP message domain OR HTTP transport nodes with XMLNSC message domain to implement Web Services. Several advantages exist if we use SOAP nodes :
  • Support for WS-Addressing, WS-Security and SOAP headers.
  • A common SOAP logical tree format, independent of the bitstream format.
  • Runtime checking against WSDL.
  • Automatic processing of SOAP with Attachments (SwA). (Although the HTTP nodes can process SwA messages, we must use the MIME message domain)
  • Automatic processing of Message Transmission Optimization Mechanism (MTOM).


Cases where it might be better to use HTTP nodes include:
  • Message flows that interact with Web services that use different standards, such as REST or XML-RPC. (We don't have a WSDL definition)
  • Message flow that never use WS-Addressing, WS-Security, SwA, or MTOM.
MTOM :

  • It is the W3C Message Transmission Optimization Mechanism, a method of efficiently sending binary data to and from Web services.
  • The efficiency claims of MTOM only refers to the size of the messages sent across the wire. 
  • Since SOAP uses XML, any binary data in the SOAP message will have to be encoded as text. This is usually done using Base64 encoding which increases the size of the binary data by 33%. 
  • MTOM provides a way to send the binary data in its original binary form, avoiding any increase in size due to encoding it in text. 
  • MTOM does not address the efficiency of serializing or deserializing the messages.

WebService scenario in WMB V7.0

This post elaborates a particulate scenario where Aggregation is being implemented using different web service nodes ( SOAP & HTTP Nodes)


Background :
Aggregation is the generation and fan-out of related requests that are derived from a single input message. It is also the fan-in of the corresponding replies to produce a single aggregated reply message.

Aggregation is an advanced form of message routing. With aggregation, a request message is received, and multiple new different request messages are generated. Each new message is routed to its  destination using a request-reply interaction.

Aggregation Nodes:
  • AggregateControl, AggregateRequest nodes (Used in Fan-Out to broadcast the request message to multiple destinations 
  • AggregateReply (Used in Fan-In to collect responses)
  • ‘Aggregate Name’ property of AggregateControl & AggregateReply nodes should be the same.
  • ‘Folder Name’ property of the AggregateRequest node decide how the input will be structured  in Fan-Out flow.
  • The AggregateReply node creates a folder in the combined message tree below Root, called ComIbmAggregateReplyBody. Below this folder, the node creates a number of subfolders using the names that you set in the AggregateRequest nodes. These subfolders are populated with the associated reply messages.

Broker internally maintains aggregation state in following queues:
  • SYSTEM.BROKER.AGGR.REQUEST
  • SYSTEM.BROKER.AGGR.CONTROL
  • SYSTEM.BROKER.AGGR.REPLY
  • SYSTEM.BROKER.AGGR.UNKNOWN
  • SYSTEM.BROKER.AGGR.TIMEOUT


Core Aggregation Flows :


Fan Out Flow :


Fan In Flow :

Input :
      <myms:SaleEnvelope  xmlns:myms="http://tempuri.org/MyMS">
         <myms:SaleList>
            <myms:Invoice>
               <myms:Initial>A</myms:Initial>
               <myms:Balance>B</myms:Balance>
               <myms:Currency>C</myms:Currency>
            </myms:Invoice>
         </myms:SaleList>
       <myms:SaleList>
            <myms:Invoice>
               <myms:Initial>A1</myms:Initial>
               <myms:Balance>B1</myms:Balance>
               <myms:Currency>C1</myms:Currency>
            </myms:Invoice>
         </myms:SaleList>
      </myms:SaleEnvelope>


Output :
<ABC>
 <AG2>
  <SaleEnvelope>
   <SaleList>
    <Invoice xmlns:NS1="http://tempuri.org/MyMS">
     <Initial>a</Initial>
     <Balance>60.16</Balance>
     <Currency>Dollar</Currency>
    </Invoice>
   </SaleList>
  </SaleEnvelope>
 </AG2>
 <AG1>
  <SaleEnvelope>
   <SaleList>
    <Invoice xmlns:NS1="http://tempuri.org/MyMS">
     <Initial>S</Initial>
     <Balance>07.55</Balance>
     <Currency>Rupees</Currency>
    </Invoice>
   </SaleList>
  </SaleEnvelope>
 </AG1>
</ABC>


Wrapper (Web Service) Flows :


The same flow can be called by HTTPInput Node or SOAPInput Node.


HTTPCaller Flow :



Input & Output for the above flow would be same as normal flow mentioned above.

Different ways of calling HTTPInput node (Web Service implemented using HTTP nodes) :
  • nettool (Its a tool ; Need to give the URL & input xml)
  • Another message flow which uses HTTPRequest node to call HTTPCaller flow.
  • Java : Can be called through plain Java code; following code sample is a standalone Java program to call HTTPCaller flow.
Code :
import java.io.BufferedReader;
import java.io.DataOutputStream;
import java.io.FileReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;

public class HTTPCaller{
public static void main(String[] args) throws Exception {
// Default port for HTTPInput node is 7080
// Path suffix for URL :/path/to/aggrservice/
URL url = new URL("http://localhost:7080/path/to/aggrservice/");
URLConnection urlConn = url.openConnection();
FileReader fileReader = new FileReader("C://Input.xml"); // Input XML (It is same as above input xml)
urlConn.setDoOutput(true);
InputStreamReader inStream = null;
BufferedReader buff = null;
String nextLine;
String inputLine;
BufferedReader in = new BufferedReader(fileReader);
DataOutputStream printout = new DataOutputStream(urlConn.getOutputStream());
while ((inputLine = in.readLine()) != null){
printout.writeBytes(inputLine);
}
printout.flush();
printout.close();

// Get Response data.
inStream = new InputStreamReader(urlConn.getInputStream());
buff = new BufferedReader(inStream);
while (true) {
nextLine = buff.readLine();
if (nextLine != null) {
System.out.println(nextLine);
} else {
break;
}
}
in.close();
}
}

SOAPCaller Flow :



Input :
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:myms="http://tempuri.org/MyMS">
   <soapenv:Header/>
   <soapenv:Body>
      <myms:SaleEnvelope>
          <myms:SaleList>
            <myms:Invoice>
               <myms:Initial>A</myms:Initial>
               <myms:Balance>B</myms:Balance>
               <myms:Currency>C</myms:Currency>
            </myms:Invoice>
         </myms:SaleList>
         <myms:SaleList>
            <myms:Invoice>
               <myms:Initial>A1</myms:Initial>
               <myms:Balance>B1</myms:Balance>
               <myms:Currency>C1</myms:Currency>
            </myms:Invoice>
         </myms:SaleList>
      </myms:SaleEnvelope>
   </soapenv:Body>
</soapenv:Envelope>


Output :
<soapenv:Envelope xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   <soapenv:Body>
      <ABC>
         <AG1>
            <SaleEnvelope>
               <SaleList>
                  <NS1:Invoice xmlns:NS1="http://tempuri.org/MyMS">
                     <NS1:Initial>A</NS1:Initial>
                     <NS1:Balance>B</NS1:Balance>
                     <NS1:Currency>C</NS1:Currency>
                  </NS1:Invoice>
               </SaleList>
            </SaleEnvelope>
         </AG1>
         <AG2>
            <SaleEnvelope>
               <SaleList>
                  <NS1:Invoice xmlns:NS1="http://tempuri.org/MyMS">
                     <NS1:Initial>A1</NS1:Initial>
                     <NS1:Balance>B1</NS1:Balance>
                     <NS1:Currency>C1</NS1:Currency>
                  </NS1:Invoice>
               </SaleList>
            </SaleEnvelope>
         </AG2>
      </ABC>
   </soapenv:Body>
</soapenv:Envelope>



Different ways of calling SOAPInput node (Web Service implemented using SOAP nodes) :
// Default port for SOAPInput node is 7800
// Path suffix for URL : /MyMSSOAP_HTTP_Service ; so the URL would be http://localhost:7800/MyMSSOAP_HTTP_Service?wsdl