Solution
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 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
Petals Settings and Messages Flows
|
Deployed configurations:
- One Petals ESB node has:
- 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
Configuring the sample JSR181 Service Unit
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 }
The following files can be generated by the Petals Studio.
<?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>
<?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>
<?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>
The method will be packaged in su-jsr181-MathOperations-provide
Configuring SE-EIP: Aggregator and Splitter patterns
SE-EIP Splitter
<?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>
SE-EIP Aggregator
<?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>
Explanation of the Xpath operations (you can look at this great Xpath tutorial)
Retrieve elements inside the <AddIntegers> node :
<eip:aggregator-correlation>boolean(/*[local-name()="AddIntegers"])</eip:aggregator-correlation>
Triggers messages when receiving <equals/> in the node <AddIntegers> :
<eip:test>boolean(/*[local-name()="AddIntegers"]/*[local-name()="equals"])</eip:test>
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 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.
<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 :
<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...
<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>
Let us send the trigger message :
<AddIntegers xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" > <equals/> </AddIntegers>
Now all messages are processed by MathOperations :
<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>