View Source

{section}
{column}

h1. Rationale and Context

An enterprise wants to delay some operations off-peak hours. Instead of calling operations directly, we will bufferize them, and send them later, when a trigger signal comes (might be automated, or activated by user).
{column}
{hide-if:display=pdf}
{column:width=350px}
{panel:title=Table of contents}{toc}{panel}
{panel:title=Contributors}{contributors:order=name|mode=list}{panel}
{column}
{hide-if}
{section}


h1. Solution

h2. Overall solution

We want to call the operation "AddIntegers" on a service "MathOperations", using a buffer to process all operations in one time. MathOperations needs two integer parameters, <integer1> and <integer2>, and&nbsp; returns their sum.

Message process :


* Send several messages to an EIP pattern "Aggregator", which bufferize the messages
* Send a trigger message to *EipAggregator*
* *EipAggregator* sends an aggregated message to the next step, *EipSPlitter* in our case.
* *EipSplitter* splits the aggregated message into the multiple messages.
* *EipSPlitter* sends the multiple messages to the operation *AddIntegers* on the service *MathOperations*
* *MathOperations.AddIntegers* processes the messages and sends a response



h2. Petals Settings and Messages Flows

{gliffy:name=Petals RMI-EIP-JSR181|align=left|size=L|version=5}
*Deployed configurations:*
# One Petals ESB node has:
## [SE-RMI|Petals-SE-RMI] for sending test messages via [webconsole|webconsole:User Guide]
## [SE-EIP|Petals-SE-EIP] for the buffering chain + 1
## [SE-JSR181|Petals-SE-Jsr181 1.1] which contains the operation "AddIntegers" on the sample&nbsp;service "MathOperations"
# Then we will configure and deploy
## One Service Assembly (SA) containing two EIP Service Unit (SU) : Aggregator and Splitter patterns
## One SA containing one sample JSR181 SU: "MathOperations" with the operation "AddIntegers"

*Message flows:*
# From SE-RMI to SE-EIP "Aggregator"
# From SE-EIP "Aggregator" to SE-EIP "Splitter"
# From SE-EIP "Splitter" to JSR181 "MathOperations"

*This usecase was tested with:*


* Petals ESB 3.1, Petals-SE-EIP 2.4.3, Petals-SE-Jsr-181 1.1.3, Petals-SE-RMI-1.1.1, Petals webconsole 2.0.3. Configurations were generated using Petals Studio 1.1.0
* Petals ESB 3.1.1, Petals-SE-EIP 2.5, Petals-SE-Jsr-181 1.1.3, Petals-SE-RMI-1.1.2, Petals webconsole 2.0.4. Configurations were generated using Petals Studio 1.1.1


h1. Configuring the sample JSR181 Service Unit
{code:lang=java|title=MyMathOperations.java}package com.petalslink.test;

//import javax.jws.Oneway;
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebResult;
import javax.jws.WebService;

/**
* Here is a sample JAX-WS implementation.
* <p>
* For more information about JAX-WS, please visit
* <b>https://jax-ws.dev.java.net/jax-ws-ea3/docs/annotations.html</b>.
* </p>
*
* @author mlebreton
*/
@WebService( serviceName="MyMathOperations", targetNamespace="http://test.petalslink.com", portName="MyMathOperationsPort" )
public class MyMathOperations {

/* (non-Javadoc)
* @see JaxWSInterface#HelloWorld()
*/
@WebMethod( operationName="AddIntegers" ) // @WebMethod: Name of service operations that we will call
@WebResult( name="returnMessage" ) // @WebResult: Name of the message returned by service
public Integer AddIntegers( @WebParam( name="integer1" ) Integer integer1, @WebParam( name="integer2" ) Integer integer2 ) { //@WebParam => Name of service parameters
Integer result;
result = integer1+integer2;
return result;
}; // Returns the sum of two integers
}{code}
The following files can be generated by the Petals Studio.


{code:lang=xml|title=MyMathOperations_schema1.xsd|collapse=true|theme=Default}<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xs:schema version="1.0" targetNamespace="http://test.petalslink.com" xmlns:tns="http://test.petalslink.com" xmlns:xs="http://www.w3.org/2001/XMLSchema">

<xs:element name="AddIntegers" type="tns:AddIntegers"/>

<xs:element name="AddIntegersResponse" type="tns:AddIntegersResponse"/>

<xs:complexType name="AddIntegers">
<xs:sequence>
<xs:element name="integer1" type="xs:int" minOccurs="0"/>
<xs:element name="integer2" type="xs:int" minOccurs="0"/>
</xs:sequence>
</xs:complexType>

<xs:complexType name="AddIntegersResponse">
<xs:sequence>
<xs:element name="returnMessage" type="xs:int" minOccurs="0"/>
</xs:sequence>
</xs:complexType>

</xs:schema>{code}

{code:lang=xml|title=jbi.xml|collapse}<?xml version="1.0" encoding="UTF-8"?>
<!-- JBI descriptor for the Petals component petals-se-jsr181 -->
<jbi:jbi version="1.0"
xmlns:jbi="http://java.sun.com/xml/ns/jbi"
xmlns:jsr181="http://petals.ow2.org/components/jsr181/version-1"
xmlns:petalsCDK="http://petals.ow2.org/components/extensions/version-5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<jbi:services binding-component="false">

<jbi:provides
interface-name="generatedNs:MyMathOperations"
service-name="generatedNs:MyMathOperations"
endpoint-name="MyMathOperationsPort"
xmlns:generatedNs="http://test.petalslink.com">

<!-- CDK elements -->
<petalsCDK:wsdl>MyMathOperations.wsdl</petalsCDK:wsdl>

<!-- Component specific elements -->
<jsr181:class>com.petalslink.test.MyMathOperations</jsr181:class>

</jbi:provides>

</jbi:services>
</jbi:jbi>{code}

{code:lang=xml|title=MyMathOperations.wsdl}<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<!-- Generated by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is JAX-WS RI 2.1.6 in JDK 6. -->
<definitions targetNamespace="http://test.petalslink.com" name="MyMathOperations" xmlns="http://schemas.xmlsoap.org/wsdl/" xmlns:tns="http://test.petalslink.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/">
<types>
<xsd:schema>
<xsd:import namespace="http://test.petalslink.com" schemaLocation="MyMathOperations_schema1.xsd"/>
</xsd:schema>
</types>
<message name="AddIntegers">
<part name="parameters" element="tns:AddIntegers"/>
</message>
<message name="AddIntegersResponse">
<part name="parameters" element="tns:AddIntegersResponse"/>
</message>
<portType name="MyMathOperations">
<operation name="AddIntegers">
<input message="tns:AddIntegers"/>
<output message="tns:AddIntegersResponse"/>
</operation>
</portType>
<binding name="MyMathOperationsPortBinding" type="tns:MyMathOperations">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="AddIntegers">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="MyMathOperations">
<port name="MyMathOperationsPort" binding="tns:MyMathOperationsPortBinding">
<soap:address location="REPLACE_WITH_ACTUAL_URL"/>
</port>
</service>
</definitions>{code}

The method will be packaged in su-jsr181-MathOperations-provide

h1. Configuring SE-EIP: Aggregator and Splitter patterns

h2. SE-EIP Splitter
{code:lang=xml|title=jbi.xml}<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" encoding="UTF-8"?>
<jbi:jbi version="1.0"
xmlns:eip="http://petals.ow2.org/components/eip/version-2"
xmlns:generatedNs="http://test.petalslink.com"
xmlns:jbi="http://java.sun.com/xml/ns/jbi"
xmlns:petalsCDK="http://petals.ow2.org/components/extensions/version-5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<jbi:services binding-component="false">
<jbi:provides
interface-name="generatedNs:EipSplitterInterface"
service-name="generatedNs:EipSplitter"
endpoint-name="EipSplitterEndpoint">

<!-- CDK specific elements -->
<petalsCDK:timeout>30000</petalsCDK:timeout>
<petalsCDK:validate-wsdl>false</petalsCDK:validate-wsdl>
<petalsCDK:forward-security-subject>false</petalsCDK:forward-security-subject>
<petalsCDK:forward-message-properties>false</petalsCDK:forward-message-properties>
<petalsCDK:forward-attachments>false</petalsCDK:forward-attachments>
<petalsCDK:wsdl xsi:nil="true" />

<!-- Component specific elements -->
<eip:eip>splitter</eip:eip>
<eip:test>//*[local-name()="AddIntegers"]</eip:test>
<eip:fault-robust>false</eip:fault-robust>
<eip:exception-robust>false</eip:exception-robust>
<eip:attachment-mode>false</eip:attachment-mode>
</jbi:provides>

<!-- Consumed project 1 ( test = //*[local-name()="AddIntegers"] ) -->
<jbi:consumes
interface-name="iConsumeNsPrefix:MyMathOperations"
service-name="iConsumeNsPrefix:MyMathOperations"
endpoint-name="MyMathOperationsPort"
xmlns:iConsumeNsPrefix="http://test.petalslink.com">

<!-- CK specific fields for this consume -->
<petalsCDK:timeout>30000</petalsCDK:timeout>
<petalsCDK:operation xmlns:AddIntegersNs="http://test.petalslink.com">AddIntegersNs:AddIntegers</petalsCDK:operation>
<petalsCDK:mep>InOut</petalsCDK:mep>
</jbi:consumes>
</jbi:services>
</jbi:jbi>{code}

h2. SE-EIP Aggregator
{code:lang=xml|title=jbi.xml}<?xml version="1.0" encoding="UTF-8"?>
<jbi:jbi version="1.0"
xmlns:eip="http://petals.ow2.org/components/eip/version-2"
xmlns:generatedNs="http://test.petalslink.com"
xmlns:jbi="http://java.sun.com/xml/ns/jbi"
xmlns:petalsCDK="http://petals.ow2.org/components/extensions/version-5"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">

<jbi:services binding-component="false">
<jbi:provides
interface-name="generatedNs:EipAggregatorInterface"
service-name="generatedNs:EipAggregator"
endpoint-name="EipAggregatorEndpoint">

<!-- CDK specific elements -->
<petalsCDK:timeout>30000</petalsCDK:timeout>
<petalsCDK:validate-wsdl>false</petalsCDK:validate-wsdl>
<petalsCDK:forward-security-subject>false</petalsCDK:forward-security-subject>
<petalsCDK:forward-message-properties>false</petalsCDK:forward-message-properties>
<petalsCDK:forward-attachments>false</petalsCDK:forward-attachments>
<petalsCDK:wsdl xsi:nil="true" />

<!-- Component specific elements -->
<eip:eip>aggregator</eip:eip>
<eip:test>boolean(/*[local-name()="AddIntegers"]/*[local-name()="equals"])</eip:test>
<eip:aggregator-correlation>boolean(/*[local-name()="AddIntegers"])</eip:aggregator-correlation>
<eip:fault-robust>false</eip:fault-robust>
<eip:exception-robust>false</eip:exception-robust>
<eip:attachment-mode>false</eip:attachment-mode>
</jbi:provides>

<!-- Consumed project 1 ( test = boolean(/*[local-name()="AddIntegers"]/*[local-name()="equals"]) ) -->
<jbi:consumes
interface-name="iConsumeNsPrefix:EipSplitterInterface"
service-name="iConsumeNsPrefix:EipSplitter"
endpoint-name="EipSplitterEndpoint"
xmlns:iConsumeNsPrefix="http://test.petalslink.com">

<!-- CK specific fields for this consume -->
<petalsCDK:timeout>30000</petalsCDK:timeout>
<petalsCDK:mep>InOut</petalsCDK:mep>
</jbi:consumes>
</jbi:services>
</jbi:jbi>{code}

*Explanation of the Xpath operations (you can look at this great* *[Xpath tutorial|http://www.w3schools.com/XPath/default.asp]**)*


Retrieve elements inside the <AddIntegers> node :

{code:lang=xml}<eip:aggregator-correlation>boolean(/*[local-name()="AddIntegers"])</eip:aggregator-correlation>{code}

Triggers messages when receiving <equals/> in the node <AddIntegers> :

{code:lang=xml}<eip:test>boolean(/*[local-name()="AddIntegers"]/*[local-name()="equals"])</eip:test>{code}

h1. Running the use case

To test this use case, you need to deploy the Petals-SE-EIP, Petals-SE-RMI, Petals-SE-JSR181 and run the webconsole.

Deploy the SA containing the SU su-jsr181-MathOperations-provide. Deploy the SA&nbsp;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.

{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}

When everything is fine, you get this response, just saying the message was buffered :
{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}

We can continue to bufferize messages...
{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}

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

Now all messages are processed by MathOperations :
{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}