Petals Getting started - day 5 - EIP Orchestration

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.

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

(Download Petals binaries for this guide here)

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.
Full Size
A Gliffy Diagram named: 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]

Configure the Splitter

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

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

  1. Create a new Service Assembly.
    Service Assembly  
    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.

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

  1. Elements which satisfy "aggregator-correlation" are aggregated
    <eip:aggregator-correlation>boolean(/*[local-name()="AddIntegers"])</eip:aggregator-correlation>

    Elements inside <AddIntegers> will be aggregated.

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

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

  1. Deploy the SA containing the SU su-jsr181-MathOperations-provide.
  2. Deploy the SA sa-Eip-AggregatorSplitter.
  3. Send messages from webconsole, with InOut MEP (message exchange pattern).
  4. Send the trigger message.
Message 1
<AddIntegers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<integer1>1</integer1>
<integer2>2</integer2>
</AddIntegers>
Response message
<result xmlns="http://petals.ow2.org/petals-se-eip/aggregator">Aggregator: the content is buffered by the pattern</result>
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>
Message 4 - Trigger
<AddIntegers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" >
<equals/>
</AddIntegers>
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 this Orchestration 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.