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 :
<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.
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) :
- SoapUI (Its a tool ; Need to give wsdl & input xml)
- Another message flow which uses SOAPRequest node to call SOAPCaller flow.
- Java : Can be called through plain Java code; following post has example of how to call a web service: http://harishonsoa.blogspot.com/2011/12/calling-any-service-using-webservice.html
// 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
No comments:
Post a Comment