Petals Getting started - day 5 - EIP Orchestration

Last tested with
  • 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

Today you will bufferize messages, to process them all in one by MathOperations.

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.
Macro Error Cannot find the diagram with these parameters:
name: Petals RMI-EIP-JSR181
version:
pageName: Bufferize operations with EIP
pageId:
spaceKey: petalsesb

Little bit of theory: EIP (Enterprise Integration Patterns) and XPath

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

What is Splitter Pattern ?

What is XPath ?

Run this tutorial (takes ~30 min) for Xpath : http://www.w3schools.com/XPath/default.asp
We will use XPath to control conditions on EIP patterns.

Configure the Splitter

  1. Create a new EIP Technical service with the following configuration:
Parameter name
Value
Comments
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

  1. Create a new EIP Technical service with the following configuration:
Parameter name
Value
Comments
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 Auto-configuration
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 There is no wsdl

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).

  1. Create a new Service Assembly.
    1. Name: sa-Eip-AggregatorSplitter
  2. Add the two EIP Service-Units you created, and confirm
  3. Fast-export the Service Assembly for Petals.
  4. Deploy in Petals ESB.

Review the chain

EIP Agregator

<eip:aggregator-correlation>boolean(/*[local-name()="AddIntegers"])</eip:aggregator-correlation>

Messages which satisfy "aggregator-correlation" will be aggregated. <=> Elements inside <AddIntegers> will be aggregated.

<eip:test>boolean(/*[local-name()="AddIntegers"]/*[local-name()="equals"])</eip:test>

Messages which satisfy "test" act as the, to send the aggregated buffer. <=> If <AddIntegers> contains <equals> element, aggregated message is sent to the next service and buffer cleared.

EIP Splitter

<eip:test>//*[local-name()="AddIntegers"]</eip:test>

Elements which satisfy "test" are extracted and sent to the next service. <=> <AddIntegers> elements are split and each one is sent in one message.

Test the EIP chain

Deploy the SA containing the SU su-jsr181-MathOperations-provide. Deploy the SA sa-Eip-AggregatorSplitter.

Then we can send test messages from the webconsole. For example, we will send three messages, with InOut MEP (message exchange pattern), and then send the trigger message.

Message 1
<AddIntegers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<integer1>1</integer1>
<integer2>2</integer2>
</AddIntegers>

When everything is fine, you get this response, just saying the message was buffered :

Response message
<result xmlns="http://petals.ow2.org/petals-se-eip/aggregator">Aggregator: the content is buffered by the pattern</result>

We can continue to bufferize messages...

Message 2
<AddIntegers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<integer1>3</integer1>
<integer2>4</integer2>
</AddIntegers>
Message 3
<AddIntegers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<integer1>5</integer1>
<integer2>6</integer2>
</AddIntegers>

Let us send the trigger message :

Message 4 - Trigger
<AddIntegers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<equals/>
</AddIntegers>

Now all messages are processed by MathOperations :

Response message
<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.

Enter labels to add to this page:
Please wait 
Looking for a label? Just start typing.