Hi ! Today is you last day. You will create a simple process: bufferize messages, and execute all of them in one time with MathOperations. You will use EIP chains for this.
- Petals ESB 3.1
- Petals Studio 1.1.0
- Petals SE RMI 1.1.1
- Petals BC SOAP 4.0.2
- Petals Webconsole 2.0.3
- Tomcat 6.0.29
- JDK 6 update 20
- Petals SE Jsr181 1.1.2
Added in this tutorial :
- Petals SE EIP 2.4.3
This tutorial is based on EIP Buffer complex use case. |
Definition of our integration process
You will use Enterprise Integration Patterns (EIP, see below for explanations) to create this process :
- Several messages are sent to an EIPAggregator pattern, which bufferize all incoming messages.
- Trigger message is sent to EipAggregator.
- EipAggregator sends an aggregated message to EipSPlitter.
- EipSplitter splits the aggregated message back into multiple messages.
- EipSPlitter sends the multiple messages to the operation AddIntegers on the service MathOperations.
- MathOperations.AddIntegers processes the messages and send you the responses.
|
What is EIP ?
A set of design patterns for enterprise application integration.
What is Agregator pattern ?
[TODO]
What is Splitter Pattern ?
[TODO]
Configure the Splitter
- Create a new EIP Technical service with the following configuration:
Parameter name
Value
JBI propertie Interface namespace http://test.petalslink.com InterfaceName EipSplitterInterface Service Namespace http://test.petalslink.com Service Name EipSplitter End-point Name EipSplitterEndpoint Project Name and Location Project Name su-EIP-EipSplitter-provide Specific Component properties Eip Splitter Service Parameters Service Parameters Select "su-jsr181-MathOperations-provide" Auto-configuration XPath Condition XPath Condition //*[local-name()="AddIntegers"] Additional Parameters Operation Namespace http://test.petalslink.com Operation AddIntegers Mep InOut CDK properties Validate WSDL false There is no wsdl
Configure the Aggregator
- Create a new EIP Technical service with the following configuration:
Parameter name |
Value |
---|---|
JBI propertie | |
Interface namespace | http://test.petalslink.com |
InterfaceName | EipAggregatorInterface |
Service Namespace | http://test.petalslink.com |
Service Name | EipAggregator |
End-point Name | EipAggregatorEndpoint |
Project Name and Location | |
Project Name | su-EIP-EipAggregator-provide |
Specific Component properties | |
Eip | Aggregator |
Aggregator Correlation |
boolean(/*[local-name()="AddIntegers"]) |
Service Parameters | |
Service Parameters | Select "su-EIP-EipSPlitter-provide" |
XPath Condition | |
XPath Condition | boolean(/*[local-name()="AddIntegers"\]/*[local-name()="equals"]) |
Additional Parameters | |
Operation Namespace | http://test.petalslink.com |
Operation | AddIntegers |
Mep | InOut |
CDK properties | |
Validate WSDL | false |
Create and deploy an EIP Service Assembly
There is a tight-coupling between both EIP. Assembling them in one single SA can be a good idea (especially with EIP, which can chain lots of patterns, each requiring a different SU).
- Create a new Service Assembly.
Service Assembly Name sa-Eip-AggregatorSplitter - Add the two EIP Service-Units you created, and confirm.
- Fast-export the Service Assembly for Petals.
- Deploy in Petals ESB.
Understand XPath expressions
What is XPath ?
Run this tutorial (takes ~30 min) for Xpath : http://www.w3schools.com/XPath/default.asp
Now try to understand the XPath expressions we used. If you use EIP later, it is essential to understand and be able to write XPath.
EIP Agregator conditions
- Elements which satisfy "aggregator-correlation" are aggregated
<eip:aggregator-correlation>boolean(/*[local-name()="AddIntegers"])</eip:aggregator-correlation>
Elements inside <AddIntegers> will be aggregated.
- When "test" is true, aggregated message is sent.
<eip:test>boolean(/*[local-name()="AddIntegers"]/*[local-name()="equals"])</eip:test>
When <AddIntegers> contains the <equals> element, the aggregated message is sent to the next service, and buffer cleared.
EIP Splitter conditions
- Elements which satisfy "test" are extracted and sent to the next service.
<eip:test>//*[local-name()="AddIntegers"]</eip:test>
<AddIntegers> elements are split and sent one by one.
Test the EIP chain
- Deploy the SA containing the SU su-jsr181-MathOperations-provide.
- Deploy the SA sa-Eip-AggregatorSplitter.
- Send messages from webconsole, with InOut MEP (message exchange pattern).
- Send the trigger message.
<AddIntegers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > <integer1>1</integer1> <integer2>2</integer2> </AddIntegers>
<result xmlns="http://petals.ow2.org/petals-se-eip/aggregator">Aggregator: the content is buffered by the pattern</result>
<AddIntegers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<integer1>3</integer1>
<integer2>4</integer2>
</AddIntegers>
<AddIntegers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > <integer1>5</integer1> <integer2>6</integer2> </AddIntegers>
<AddIntegers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > <equals/> </AddIntegers>
<result xmlns="http://petals.ow2.org/petals-se-eip/splitter"> <dlwmin:AddIntegersResponse xmlns:dlwmin="http://test.petalslink.com" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <returnMessage xmlns="">3</returnMessage> </dlwmin:AddIntegersResponse> <dlwmin:AddIntegersResponse xmlns:dlwmin="http://test.petalslink.com" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <returnMessage xmlns="">7</returnMessage> </dlwmin:AddIntegersResponse> <dlwmin:AddIntegersResponse xmlns:dlwmin="http://test.petalslink.com" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <returnMessage xmlns="">11</returnMessage> </dlwmin:AddIntegersResponse> </result>
More about orchestration
Look at other EIP patterns. Simple theory exercise: how would you do in this case....?
[TODO]
Other orchestration ways: BPEL, SCA, JSR181 or POJO. More info in whitepaper
EIP : Good performances. But complicated and a bit "dirty old way" (for example, do not use WSDL).
BPEL: Based on XML and WSDL. Standard. Quite complicated to learn. Poorer performances.
SCA: The simplest. Java code based on WSDL.
POJO or JSR181: Needs advanced Java programmation.
Custom JBI Component: Needs lot of skills. Best performances. Hard to maintain.