View Source

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.


{panel:title=Last tested with}
* Petals Guide Package 1.0 - [Download binaries here|http://doc.petalslink.com/x/t4KK]
* Tomcat 6.0.29
* JDK 6 update 20
* SoapUI 3.6

This Tutorial uses:
* Petals Studio
* Petals ESB
* Petals SE RMI
* Petals BC SOAP
* Petals Web console
* Tomcat
* soapUI
* Petals SE Jsr-181
* Petals SE EIP _(new)_
{panel}
{info}This tutorial is based on the use case: [petalscomponents:Bufferize operations with EIP].
{info}

h2. Integration process definition

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.

{gliffy:space=petalscomponents|page=Bufferize operations with EIP|name=Petals RMI-EIP-JSR181}

*What is EIP ?*
A set of design patterns for enterprise application integration.

*What is Agregator pattern ?*
[TODO]



*What is Splitter Pattern ?*
[TODO]



h2. Configure the Splitter


# Launch *Petals Studio*.
# Click *File > New > Service-Unit Project*.
# Select *Use a Petals technical Service > EIP > Your_EIP_Version*.
# Configure Splitter Service-Unit with following configuration:
|| Parameter name \\ || Value \\ ||
|| JBI properties || _Note: EIP does not need a WSDL_ \\ ||
| 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 |
|| Chain calls (1) || ||
| Eip: | Splitter |
|| Chain calls (2) \\ || ||
| Selected Pattern: splitter | see below for configuration |
# Click *Add > Edit*. It displays the window "EIP: Invoked Service 1".
# Click *Select a service*.
# Double click *MathOperations implements MathOperations @ MathOperationsPort*.
# Fill the following properties for Invoked Service 1:
|| Service Identifiers || _Note: auto-configured_ ||
|| Invocation Properties || ||
| Operation Namespace: | [http://test.petalslink.com] |
| Operation: | AddIntegers |
| Mep: | InOut |
|| Routing Condition || ||
| XPath Condition | //*\[local-name()="AddIntegers"\] |
# Click *Ok > Next > Finish*.

h2. Configure the Aggregator

# Create a *New Service-Unit Project* for *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 | {noformat:nopanel=true}boolean(/*[local-name()="AddIntegers"\]/*[local-name()="equals"]){noformat} |
|| Additional Parameters || ||
| Operation Namespace | [http://test.petalslink.com] |
| Operation | AddIntegers |
| Mep | InOut |
|| CDK properties || ||
| Validate WSDL | false |


h2. Create and deploy an EIP Service Assembly

There is a tight-coupling between both EIP. Assembling them in one single Service Assembly (SA) can be a good idea (especially with EIP, which can chain lots of patterns, each requiring a different SU).
# Click *File > New > Service Assembly Project*.
|| Service Assembly || ||
| Name: | sa-Eip-AggregatorSplitter |
| Artifact ID: \\ | sa-Eip-AggregatorSplitter |
# Click *Next*.
# Check *su-EIP-EipSplitter-provide* and *su-EIP-EipAggregator-provide*.
# Click *Finish*.
# *Fast-export* the Service Assembly for Petals.
# Deploy Petals-SE-EIP in Petals ESB
# Deploy sa-Eip-AggregatorSplitter in Petals ESB.


h2. Understand XPath expressions

*What is XPath ?*

Run this tutorial (takes \~30 min) for Xpath : [http://www.w3schools.com/XPath/default.asp|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
{code:lang=xml}<eip:aggregator-correlation>boolean(/*[local-name()="AddIntegers"])</eip:aggregator-correlation>{code}
Elements inside <AddIntegers> will be aggregated.

# When "test" is true, aggregated message is sent.
{code:lang=xml}<eip:test>boolean(/*[local-name()="AddIntegers"]/*[local-name()="equals"])</eip:test>{code}
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.
{code:lang=xml}<eip:test>//*[local-name()="AddIntegers"]</eip:test>{code}
<AddIntegers> elements are split and sent one by one.

h2. Test the EIP chain

# Deploy the SA containing the SU su-jsr181-MathOperations-provide.
# Deploy the SA&nbsp;sa-Eip-AggregatorSplitter.
# Send messages from webconsole, with InOut MEP (message exchange pattern).
# Send the trigger message.

{code:lang=xml|title=Message 1|theme=Default}
<AddIntegers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<integer1>1</integer1>
<integer2>2</integer2>
</AddIntegers>
{code}

{code:lang=xml|title=Response message|theme=Default}
<result xmlns="http://petals.ow2.org/petals-se-eip/aggregator">Aggregator: the content is buffered by the pattern</result>
{code}


{code:lange=xml|title=Message 2|theme=Default}
<AddIntegers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<integer1>3</integer1>
<integer2>4</integer2>
</AddIntegers>
{code}

{code:lang=xml|title=Message 3|theme=Default}
<AddIntegers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<integer1>5</integer1>
<integer2>6</integer2>
</AddIntegers>
{code}

{code:lang=xml|title=Message 4 - Trigger|theme=Default}
<AddIntegers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<equals/>
</AddIntegers>
{code}

{code:lang=xml|title=Response message|theme=Default}
<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>
{code}

h2. 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 this* *[Orchestration Whitepaper|http://www.petalslink.com/fr/forms/orchestration-de-processus-quelle-technologie-privilegier]**.*

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.