blob: f6dc9bed25ac805f059e7407352722ec2b9392ea [file] [log] [blame]
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<!-- Generated by Apache Maven Doxia Site Renderer 1.3 at May 4, 2013 -->
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Sandesha2 -
Sandesha2 User Guide</title>
<style type="text/css" media="all">
@import url("./css/maven-base.css");
@import url("./css/maven-theme.css");
@import url("./css/site.css");
</style>
<link rel="stylesheet" href="./css/print.css" type="text/css" media="print" />
<meta name="Date-Revision-yyyymmdd" content="20130504" />
<meta http-equiv="Content-Language" content="en" />
<meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /><meta name="generator" content="amaya 9.2.1, see http://www.w3.org/Amaya/" />
</head>
<body class="composite">
<div id="banner">
<a href="http://www.apache.org/" id="bannerLeft">
<img src="http://www.apache.org/images/asf-logo.gif" alt="Apache Software Foundation" />
</a>
<a href="index.html" id="bannerRight">
<img src="images/Sandesha.jpg" alt="Sandesha" />
</a>
<div class="clear">
<hr/>
</div>
</div>
<div id="breadcrumbs">
<div class="xleft">
<span id="publishDate">Last Published: 2013-05-04</span>
&nbsp;| <span id="projectVersion">Version: 1.6.3-SNAPSHOT</span>
</div>
<div class="xright"> <a href="../core/" title="Axis2">Axis2</a>
|
<a href="http://www.apache.org" class="externalLink" title="Apache">Apache</a>
</div>
<div class="clear">
<hr/>
</div>
</div>
<div id="leftColumn">
<div id="navcolumn">
<h5>Apache Sandesha2</h5>
<ul>
<li class="none">
<a href="index.html" title="Home">Home</a>
</li>
<li class="expanded">
<a href="javascript:void(0)" title="Downloads">Downloads</a>
<ul>
<li class="none">
<a href="download.cgi" title="Releases">Releases</a>
</li>
<li class="none">
<a href="http://svn.apache.org/repos/asf/axis/axis2/java/sandesha/trunk" class="externalLink" title="Source Code">Source Code</a>
</li>
</ul>
</li>
<li class="expanded">
<a href="javascript:void(0)" title="Documentation">Documentation</a>
<ul>
<li class="none">
<strong>User Guide</strong>
</li>
<li class="none">
<a href="architectureGuide.html" title="Architecture Guide">Architecture Guide</a>
</li>
<li class="none">
<a href="apidocs/index.html" title="Java Docs">Java Docs</a>
</li>
</ul>
</li>
<li class="expanded">
<a href="javascript:void(0)" title="Project Information">Project Information</a>
<ul>
<li class="none">
<a href="mail-lists.html" title="Mailing Lists">Mailing Lists</a>
</li>
<li class="none">
<a href="team-list.html" title="Project Team">Project Team</a>
</li>
<li class="none">
<a href="issue-tracking.html" title="Issue Tracking">Issue Tracking</a>
</li>
<li class="none">
<a href="source-repository.html" title="Source Repository">Source Repository</a>
</li>
</ul>
</li>
<li class="none">
<a href="http://www.apache.org/licenses/" class="externalLink" title="License">License</a>
</li>
<li class="none">
<a href="http://www.apache.org/foundation/sponsorship.html" class="externalLink" title="Sponsorship">Sponsorship</a>
</li>
<li class="none">
<a href="http://www.apache.org/foundation/thanks.html" class="externalLink" title="Thanks">Thanks</a>
</li>
<li class="none">
<a href="http://www.apache.org/security/" class="externalLink" title="Security">Security</a>
</li>
</ul>
<a href="http://maven.apache.org/" title="Built by Maven" class="poweredBy">
<img class="poweredBy" alt="Built by Maven" src="./images/logos/maven-feather.png" />
</a>
</div>
</div>
<div id="bodyColumn">
<div id="contentBox">
<!-- Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License. --><html>
<h1>Apache Sandesha2 User's Guide</h1>
<p>This document introduces you to Apache Sandesha2. This will first take you
through a step by step process of developing a sample application using
Sandesha2. In the latter sections you will be introduced to some advance
features making you more familiar with the application.</p>
<div class="section"><h2>Contents<a name="Contents"></a></h2>
<ul>
<li><a href="#introduction">Introduction</a></li>
<li><a href="#install">Installing the Sandesa2 module</a></li>
<li><a href="#your_first_service">Creating and deploying a RM enabled Web
service - SimpleService</a></li>
<li><a href="#writing_clients">Writing clients for the SimpleService</a>
<ul>
<li><a href="#client_repo">Configuring the client repository</a></li>
<li><a href="#one_way">Doing One-Way invocation</a></li>
<li><a href="#request_reply">Doing a Request-Reply invocation</a></li>
</ul>
</li>
<li><a href="#client_api">Sandesha2 Client API</a>
<ul>
<li><a href="#version">Selecting your RM version</a></li>
<li><a href="#acks">Getting Acknowledgements and Faults to a given
Endpoint</a></li>
<li><a href="#managing">Managing Sequences</a></li>
<li><a href="#offering">Offering a Sequence ID for the Response
Sequence</a></li>
<li><a href="#creating">Creating a Sequence Without Sending any
Messages</a></li>
<li><a href="#ack_requests">Sending Acknowledgement Requests from the
Client Code</a></li>
<li><a href="#terminating">Terminating a Sequence from the Client
Code</a></li>
<li><a href="#closing">Closing a Sequence from the Client Code</a></li>
<li><a href="#blocking">Blocking the Client Code until a Sequence is
complete</a></li>
<li><a href="#reports">Working with Sandesha Reports</a>
<ul>
<li><a href="#sandesha_reports">SandeshaReports</a></li>
<li><a href="#sequence_reports">SequenceReports</a></li>
</ul>
</li>
<li><a href="#listners">Sandesha Listener Feature</a>
<ul>
<li><a href="#on_error">onError</a></li>
<li><a href="#on_timeout">onTimeOut</a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#sequences">More about sequences</a>
<ul>
<li><a href="#creation">Creation of sequences</a></li>
<li><a href="#termination">Termination of sequences</a></li>
<li><a href="#closing1">Closing of sequences</a></li>
<li><a href="#timing_out">Timing out of sequences</a></li>
</ul>
</li>
<li><a href="#delivary_assurances">Delivery Assurances of Sandesha2</a></li>
<li><a href="#configuring">Configuring Sandesha2</a>
<ul>
<li><a href="#acknowledgementinterval">AcknowledgementInterval</a></li>
<li><a href="#retransmissioninterval">RetransmissionInterval</a></li>
<li><a href="#exponentialbackoff">ExponentialBackoff</a></li>
<li><a href="#maximumretransmissioncount">MaximumRetransmissionCount</a></li>
<li><a href="#inactivitytimeout">InactivityTimeout</a></li>
<li><a href="#inactivitytimeoutmeasure">InactivityTimeoutMeasure</a></li>
<li><a href="#invokeinorder">InvokeInOrder</a></li>
<li><a href="#storagemanagers">StorageManagers</a></li>
<li><a href="#messagetypestodrop">MessageTypesToDrop</a></li>
<li><a href="#securitymanager">SecurityManager</a></li>
</ul>
</li>
</ul>
<a name="introduction" id="introduction"></a>
<div class="section"><h2>Introduction<a name="Introduction"></a></h2>
<p>Sandesha2 is a Web Service-ReliableMessaging (WS-RM) implementation for
Apache Axis2. With Sandesha2 you can make your Web services reliable, or you
can invoke already hosted reliable Web services.</p>
<p>If you want to learn more about Apache Axis2, refer to <a class="externalLink" href="http://axis.apache.org/axis2/java/core/docs/userguide.html">Apache Axis2 User
Guide</a> and <a class="externalLink" href="http://axis.apache.org/axis2/java/core/docs/Axis2ArchitectureGuide.html">Apache
Axis2 Architecture Guide</a>.</p>
<p>Architecure guide for Sandesha2 is accessible at <a href="architectureGuide.html">Sandesha2 Architecture Guide</a>.</p>
<p>Sandesha2 supports the WS-ReliableMessaging specification. It fully
supports the WS-ReliableMessaging 1.0 specification (February 2005) (<a class="externalLink" href="http://specs.xmlsoap.org/ws/2005/02/rm/ws-reliablemessaging.pdf">
http://specs.xmlsoap.org/ws/2005/02/rm/ws-reliablemessaging.pdf </a>).</p>
<p>This specification has been submitted to OASIS and currently being
standardized under the OASIS WS-RX Technical Committee as WSRM 1.1 (see <a class="externalLink" href="http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=ws-rx">
http://www.oasis-open.org/committees/tc_home.php?wg_abbrev=ws-rx </a> ).
Sandesha2 currently supports Committee Draft 4 of the specification being
developed under this technical committee ( <a class="externalLink" href="http://docs.oasis-open.org/ws-rx/wsrm/200602/wsrm-1.1-spec-cd-04.pdf">
http://docs.oasis-open.org/ws-rx/wsrm/200602/wsrm-1.1-spec-cd-04.pdf
</a>).</p>
<a name="install" id="install"></a>
<div class="section"><h2>Installing the Sandesa2 module<a name="Installing_the_Sandesa2_module"></a></h2>
<p>In this section you will be tought how to install the Sandesha2 module in
a Axis2 environment. Simply follow the given instructions step by step.</p>
<ol style="list-style-type: decimal">
<li>Download a compatible Axis2 binary distribution.</li>
<li>Extract the distribution file to a temporary folder (from now on
referred as AXIS2_HOME)</li>
<li><p>Add a user phase named 'RMPhase' to all four flows of the axis2.xml
file which is in the AXIS2_HOME/conf directory. Note the positioning of
'RMPhase' within different phaseOrders.</p>
<div><pre>
&lt;axisconfig name=&quot;AxisJava2.0&quot;&gt;
&lt;!-- REST OF THE CONFIGURATION--&gt;
&lt;phaseOrder type=&quot;InFlow&quot;&gt;
&lt;phase name=&quot;Transport&quot;/&gt;
&lt;phase name=&quot;Security&quot;/&gt;
&lt;phase name=&quot;PreDispatch&quot;/&gt;
&lt;phase name=&quot;Dispatch&quot; /&gt;
&lt;phase name=&quot;OperationInPhase&quot;/&gt;
&lt;phase name=&quot;soapmonitorPhase&quot;/&gt;
<b>&lt;phase name=&quot;RMPhase&quot;/&gt;</b>
&lt;/phaseOrder&gt;
&lt;phaseOrder type=&quot;OutFlow&quot;&gt;
<b>&lt;phase name=&quot;RMPhase&quot;/&gt;</b>
&lt;phase name=&quot;soapmonitorPhase&quot;/&gt;
&lt;phase name=&quot;OperationOutPhase&quot;/&gt;
&lt;phase name=&quot;PolicyDetermination&quot;/&gt;
&lt;phase name=&quot;MessageOut&quot;/&gt;
&lt;phase name=&quot;Security&quot;/&gt;
&lt;/phaseOrder&gt;
&lt;phaseOrder type=&quot;InFaultFlow&quot;&gt;
&lt;phase name=&quot;PreDispatch&quot;/&gt;
&lt;phase name=&quot;Dispatch&quot; /&gt;
&lt;phase name=&quot;OperationInFaultPhase&quot;/&gt;
&lt;phase name=&quot;soapmonitorPhase&quot;/&gt;
<b>&lt;phase name=&quot;RMPhase&quot;/&gt;</b>
&lt;/phaseOrder&gt;
&lt;phaseOrder type=&quot;OutFaultFlow&quot;&gt;
<b>&lt;phase name=&quot;RMPhase&quot;/&gt;</b>
&lt;phase name=&quot;soapmonitorPhase&quot;/&gt;
&lt;phase name=&quot;OperationOutFaultPhase&quot;/&gt;
&lt;phase name=&quot;PolicyDetermination&quot;/&gt;
&lt;phase name=&quot;MessageOut&quot;/&gt;
&lt;/phaseOrder&gt;
&lt;/axisconfig&gt;
</pre></div>
</li>
<li><p>Download the Sandesha2 binary distribution and extract it to a
temporary folder (from now on referred as SANDESHA2_HOME).</p>
</li>
<li><p>Get the Sandesha2 module file (sandesha2-&lt;VERSION&gt;.mar) from
SANDESHA2_HOME directory and put it to the AXIS2_HOME/repository/modules
directory.</p>
</li>
<li><p>Get the Sandesha2-policy-&lt;VERSION&gt;.jar file from the
SANDESHA2_HOME directory and put it to the AXIS2_HOME/lib directory.</p>
</li>
<li><p>Build the Axis2 web application by moving to the AXIS2_HOME/webapp
directory and running the ant target 'create.war'. Deploy the generated
axis2.war.</p>
<p></p>
</li>
</ol>
<a name="your_first_service" id="your_first_service"></a>
<div class="section"><h2>Creating and deploying a RM enabled Web service - SimpleService<a name="Creating_and_deploying_a_RM_enabled_Web_service_-_SimpleService"></a></h2>
<p>This section will give you step by step guidelines on creating a Web
service with Reliable Messaging support and making it available within your
Axis2 server. This simple service will have a single one-way operation (ping)
and a request-response operation (echoString). We assume that you have
followed the previous steps to install Sandesha2 and you have installed and
configured JDK 1.4 or later in your system. We also assume you have the
ability to compile &amp; run a simple java class.</p>
<ol style="list-style-type: decimal">
<li><p>Add all the files that come under the AXIS2_HOME/lib to your
CLASSPATH.</p>
</li>
<li><p>Add the Sandesha2 jar file (sandesha2-&lt;VERSION&gt;.jar) from your
SANDESHA2_HOME to your CLASSPATH.</p>
</li>
<li><p>Create the service implementation java file as given below and
compile it.</p>
<div><pre>
package sandesha2.samples.userguide;
import java.util.HashMap;
import java.util.Map;
import javax.xml.namespace.QName;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
public class RMSampleService {
private static Map sequenceStrings = new HashMap();
private final String applicationNamespaceName = &quot;http://tempuri.org/&quot;;
private final String Text = &quot;Text&quot;;
private final String Sequence = &quot;Sequence&quot;;
private final String echoStringResponse = &quot;echoStringResponse&quot;;
private final String EchoStringReturn = &quot;EchoStringReturn&quot;;
public OMElement echoString(OMElement in) throws Exception {
OMElement textElem = in.getFirstChildWithName(new QName (applicationNamespaceName,Text));
OMElement sequenceElem = in.getFirstChildWithName(new QName (applicationNamespaceName,Sequence));
if (textElem==null)
throw new Exception (&quot;'Text' element is not present as a child of the 'echoString' element&quot;);
if (sequenceElem==null)
throw new Exception (&quot;'Sequence' element is not present as a child of the 'echoString' element&quot;);
String textStr = textElem.getText();
String sequenceStr = sequenceElem.getText();
System.out.println(&quot;'EchoString' service got text '&quot; + textStr + &quot;' for the sequence '&quot; + sequenceStr + &quot;'&quot;);
String previousText = (String) sequenceStrings.get(sequenceStr);
String resultText = (previousText==null)?textStr:previousText+textStr;
sequenceStrings.put(sequenceStr,resultText);
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace applicationNamespace = fac.createOMNamespace(applicationNamespaceName,&quot;ns1&quot;);
OMElement echoStringResponseElem = fac.createOMElement(echoStringResponse, applicationNamespace);
OMElement echoStringReturnElem = fac.createOMElement(EchoStringReturn, applicationNamespace);
echoStringReturnElem.setText(resultText);
echoStringResponseElem.addChild(echoStringReturnElem);
return echoStringResponseElem;
}
public void ping(OMElement in) throws Exception {
OMElement textElem = in.getFirstChildWithName(new QName (applicationNamespaceName,Text));
if (textElem==null)
throw new Exception (&quot;'Text' element is not present as a child of the 'Ping' element&quot;);
String textValue = textElem.getText();
System.out.println(&quot;ping service got text:&quot; + textValue);
}
}
</pre></div>
</li>
<li><p>Create your services.xml file as following.</p>
<div><pre>
&lt;service name=&quot;RMSampleService&quot;&gt;
&lt;parameter name=&quot;ServiceClass&quot; locked=&quot;xsd:false&quot;&gt;sandesha2.samples.userguide.RMSampleService&lt;/parameter&gt;
&lt;description&gt;
The userguide Sample service.
&lt;/description&gt;
&lt;module ref=&quot;sandesha2&quot; /&gt;
&lt;module ref=&quot;addressing&quot; /&gt;
&lt;operation name=&quot;ping&quot; mep=&quot;http://www.w3.org/2004/08/wsdl/in-only&quot;&gt;
&lt;messageReceiver class=&quot;org.apache.axis2.receivers.RawXMLINOnlyMessageReceiver&quot; /&gt;
&lt;/operation&gt;
&lt;operation name=&quot;echoString&quot;&gt;
&lt;messageReceiver class=&quot;org.apache.axis2.receivers.RawXMLINOutMessageReceiver&quot; /&gt;
&lt;/operation&gt;
&lt;/service&gt;
</pre></div>
</li>
<li><p>Set RMSampleService.class and the services.xml files obtained from
the previous steps in the folder structure below. Create a
RMSampleService.aar file by compressing it using the jar or a zip
tool.</p>
<div><pre> RMSampleService.aar
|
|--META-INF
| |--services.xml
|-sandesha2
|--samples
|--userguide
|--RMSampleService.class
</pre></div>
</li>
<li><p>To deploy the web service simply drop it to the
WEB-INF/repository/services direcory of your Axis2 web application.
Please read the Axis2 userguide for more information on deploying Web
service archieves.</p>
</li>
<li><p>List the Axis2 services to see whether the SimpleService has been
correctly deployed.</p>
</li>
<li><p>Congradulations. You just deployed your first Web Service with
Reliable Messaging support from Sandesha2.</p>
</li>
</ol>
<a name="writing_clients" id="writing_clients"></a>
<div class="section"><h2>Writing Clients for Reliable Services<a name="Writing_Clients_for_Reliable_Services"></a></h2>
<a name="client_repo" id="client_repo"></a>
<div class="section"><h3>Configuring the client repository<a name="Configuring_the_client_repository"></a></h3>
<ol style="list-style-type: decimal">
<li>Create a repository directory in your system to be used as the Axis2
client repository (from now on referred as CLIENT_REPO).</li>
<li>Put the configured the axis2.xml file from the previous section to the
CLIENT_REPO directory &amp; rename it as client_axis2.xml.</li>
<li>Create a directory named 'modules' under the CLIENT_REPO.</li>
<li>Put the Sandesha mar (sandesha2-&lt;VERSION&gt;.mar) file from the
Sandesha2 binary distribution and the addressing mar file from the Axis2
binary distribution (addressing-&lt;VERSION&gt;.mar) to the
CLIENT_REPO/modules directory.</li>
<li>Now you should have the following folder structure in the CLIENT_REPO.
<p></p>
<div><pre> Client_Repo
|-- client_axis2.xml
|--modules
|--sandesha2.mar
|--addressing.mar
</pre></div>
</li>
</ol>
<a name="one_way" id="one_way"></a>
</div><div class="section"><h3>Doing One-Way invocation<a name="Doing_One-Way_invocation"></a></h3>
<ol style="list-style-type: decimal">
<li>Add all the jar files fromAXIS2_HOME/lib directory to your
CLASSPATH.</li>
<li>Put the Sandesha2 jar file (sandesha2-&lt;VERSION&gt;.jar) to your
CLASSPATH.</li>
<li><p>Create a 'UserguidePingClient.java' file with following content.</p>
<div><pre>
package sandesha2.samples.userguide;
import java.io.File;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axis2.AxisFault;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.ConfigurationContextFactory;
import org.apache.sandesha2.client.SandeshaClientConstants;
import javax.xml.namespace.QName;
public class UserguidePingClient {
private static final String applicationNamespaceName = &quot;http://tempuri.org/&quot;;
private static final String ping = &quot;ping&quot;;
private static final String Text = &quot;Text&quot;;
private static String toEPR = &quot;http://127.0.0.1:8070/axis2/services/RMSampleService&quot;;
private static String CLIENT_REPO_PATH = &quot;CLIENT_REPO&quot;;
public static void main(String[] args) throws AxisFault {
String axis2_xml = CLIENT_REPO_PATH + File.separator + &quot;client_axis2.xml&quot;;
ConfigurationContext configContext = ConfigurationContextFactory.createConfigurationContextFromFileSystem(CLIENT_REPO_PATH,axis2_xml);
Options clientOptions = new Options ();
clientOptions.setTo(new EndpointReference (toEPR));
ServiceClient serviceClient = new ServiceClient (configContext,null);
clientOptions.setAction(&quot;urn:wsrm:Ping&quot;);
serviceClient.setOptions(clientOptions);
serviceClient.engageModule(new QName (&quot;sandesha2&quot;));
serviceClient.engageModule(new QName (&quot;addressing&quot;));
serviceClient.fireAndForget(getPingOMBlock(&quot;ping1&quot;));
serviceClient.fireAndForget(getPingOMBlock(&quot;ping2&quot;));
clientOptions.setProperty(SandeshaClientConstants.LAST_MESSAGE, &quot;true&quot;);
serviceClient.fireAndForget(getPingOMBlock(&quot;ping3&quot;));
serviceClient.cleanup();
}
private static OMElement getPingOMBlock(String text) {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace namespace = fac.createOMNamespace(applicationNamespaceName,&quot;ns1&quot;);
OMElement pingElem = fac.createOMElement(ping, namespace);
OMElement textElem = fac.createOMElement(Text, namespace);
textElem.setText(text);
pingElem.addChild(textElem);
return pingElem;
}
}
</pre></div>
</li>
<li><p>In the above file replace the value of the CLIENT_REPO_PATH variable
with the full path to the CLIENT_REPO folder. This should be in a JAVA
compatible manner. e.g.: c:\\sandesha2\\repository</p>
</li>
<li>Compile the class</li>
<li>Run it.</li>
<li><p>Observe the following differences between the RM client code and a
normal Axis2 one-way client invocation.</p>
<ul>
<li>Engaging Sandesha2 module.
<p>serviceClient.engageModule(new QName (&quot;sandesha2&quot;));</p>
</li>
<li>Engaging Addressing module
<p>serviceClient.engageModule(new QName (&quot;addressing&quot;));</p>
</li>
<li>Setting the LAST_MESSAGE property before doing the last invocation.
<p>clientOptions.setProperty(SandeshaClientConstants.LAST_MESSAGE,
&quot;true&quot;);</p>
</li>
</ul>
</li>
</ol>
<a name="request_reply" id="request_reply"></a>
</div><div class="section"><h3>Doing Request-Reply invocation<a name="Doing_Request-Reply_invocation"></a></h3>
<ol style="list-style-type: decimal">
<li>Add all the jar files from the AXIS2_HOME/lib directory to your
CLASSPATH.</li>
<li>Put the Sandesha2 jar file (sandesha2-&lt;VERSION&gt;.jar) to your
CLASSPATH.</li>
<li>Create a 'UserguideEchoClient.java' file with following content.
<div><pre>
package sandesha2.samples.userguide;
import java.io.File;
import javax.xml.namespace.QName;
import org.apache.axiom.om.OMAbstractFactory;
import org.apache.axiom.om.OMElement;
import org.apache.axiom.om.OMFactory;
import org.apache.axiom.om.OMNamespace;
import org.apache.axiom.soap.SOAPBody;
import org.apache.axis2.addressing.EndpointReference;
import org.apache.axis2.client.Options;
import org.apache.axis2.client.ServiceClient;
import org.apache.axis2.client.async.AsyncResult;
import org.apache.axis2.client.async.Callback;
import org.apache.axis2.context.ConfigurationContext;
import org.apache.axis2.context.ConfigurationContextFactory;
import org.apache.sandesha2.client.SandeshaClientConstants;
public class UserguideEchoClient {
private final static String applicationNamespaceName = &quot;http://tempuri.org/&quot;;
private final static String echoString = &quot;echoString&quot;;
private final static String Text = &quot;Text&quot;;
private final static String Sequence = &quot;Sequence&quot;;
private final static String echoStringResponse = &quot;echoStringResponse&quot;;
private final static String EchoStringReturn = &quot;EchoStringReturn&quot;;
private static String toEPR = &quot;http://127.0.0.1:8070/axis2/services/RMSampleService&quot;;
private static String CLIENT_REPO_PATH = &quot;Full path to the Client Repo folder&quot;;
public static void main(String[] args) throws Exception {
String axis2_xml = CLIENT_REPO_PATH + File.separator +&quot;client_axis2.xml&quot;;
ConfigurationContext configContext = ConfigurationContextFactory.createConfigurationContextFromFileSystem(CLIENT_REPO_PATH,axis2_xml);
ServiceClient serviceClient = new ServiceClient (configContext,null);
Options clientOptions = new Options ();
clientOptions.setTo(new EndpointReference (toEPR));
clientOptions.setUseSeparateListener(true);
serviceClient.setOptions(clientOptions);
serviceClient.engageModule(new QName (&quot;sandesha2&quot;));
serviceClient.engageModule(new QName (&quot;addressing&quot;));
Callback callback1 = new TestCallback (&quot;Callback 1&quot;);
serviceClient.sendReceiveNonBlocking (getEchoOMBlock(&quot;echo1&quot;,&quot;sequence1&quot;),callback1);
Callback callback2 = new TestCallback (&quot;Callback 2&quot;);
serviceClient.sendReceiveNonBlocking(getEchoOMBlock(&quot;echo2&quot;,&quot;sequence1&quot;),callback2);
clientOptions.setProperty(SandeshaClientConstants.LAST_MESSAGE, &quot;true&quot;);
Callback callback3 = new TestCallback (&quot;Callback 3&quot;);
serviceClient.sendReceiveNonBlocking(getEchoOMBlock(&quot;echo3&quot;,&quot;sequence1&quot;),callback3);
while (!callback3.isComplete()) {
Thread.sleep(1000);
}
Thread.sleep(4000);
}
private static OMElement getEchoOMBlock(String text, String sequenceKey) {
OMFactory fac = OMAbstractFactory.getOMFactory();
OMNamespace applicationNamespace = fac.createOMNamespace(applicationNamespaceName,&quot;ns1&quot;);
OMElement echoStringElement = fac.createOMElement(echoString, applicationNamespace);
OMElement textElem = fac.createOMElement(Text,applicationNamespace);
OMElement sequenceElem = fac.createOMElement(Sequence,applicationNamespace);
textElem.setText(text);
sequenceElem.setText(sequenceKey);
echoStringElement.addChild(textElem);
echoStringElement.addChild(sequenceElem);
return echoStringElement;
}
static class TestCallback extends Callback {
String name = null;
public TestCallback (String name) {
this.name = name;
}
public void onComplete(AsyncResult result) {
SOAPBody body = result.getResponseEnvelope().getBody();
OMElement echoStringResponseElem = body.getFirstChildWithName(new QName (applicationNamespaceName,echoStringResponse));
OMElement echoStringReturnElem = echoStringResponseElem.getFirstChildWithName(new QName (applicationNamespaceName,EchoStringReturn));
String resultStr = echoStringReturnElem.getText();
System.out.println(&quot;Callback '&quot; + name + &quot;' got result:&quot; + resultStr);
}
public void onError (Exception e) {
System.out.println(&quot;Error reported for test call back&quot;);
e.printStackTrace();
}
}
}
</pre></div>
</li>
<li><p>In the above file replace the value of the CLIENT_REPO_PATH variable
with the full path to the CLIENT_REPO folder. This should be in a JAVA
compatible manner. e.g.: c:\\sandesha2\\repository</p>
</li>
<li>Compile the above class.</li>
<li>Run the above class.</li>
<li>Observer the following differences between the RM client code and a
normal Axis2 one-way client invocation.
<ul>
<li>Engaging Sandesha2 module.</li>
<li>Engaging Addressing module</li>
<li>Setting the LAST_MESSAGE property before doing the last
invocation.</li>
</ul>
</li>
</ol>
<a name="client_api" id="client_api"></a>
</div><div class="section"><h2>Sandesha2 Client API<a name="Sandesha2_Client_API"></a></h2>
<p>This section will introduce you to some client API features which you may
not use for general cases. These features will be useful if you have some
knowledge in WSRM (Web service Reliable Messaging) and if you want to
customize the default behavior of Sandesha2 to make it work according to your
requirements. Some of these have to be done by simply setting a property in
the 'Options' object which you set to your ServiceClient. For these you have
to add the sandesha2-client-&lt;VERSION&gt;.jar to your classpath. For
others, you have to use a special class called SandeshaClient, which is
available in the Sandesha-&lt;VERSION&gt;.jar file. Both these comes with
Sandesha2 distributions.</p>
<a name="version" id="version"></a>
<div class="section"><h3>Selecting your RM version<a name="Selecting_your_RM_version"></a></h3>
<p>As it was explained earlier Sandesha2 supports two WSRM specifications.
The default is the submitted WSRM specification. But if you want to change
this and work in the new OASIS WSRM specification, set the following property
in the Options object.</p>
<div><pre>clientOptions.setProperty(SandeshaClientConstants.RM_SPEC_VERSION,Sandesha2Constants.SPEC_VERSIONS.v1_1);</pre></div>
<p>To go back to the WSRM submitted specification set the property as
follows.</p>
<div><pre>clientOptions.setProperty(SandeshaClientConstants.RM_SPEC_VERSION,Sandesha2Constants.SPEC_VERSIONS.v1_0);</pre></div>
<a name="acks" id="acks"></a>
</div><div class="section"><h3><b>Getting Acknowledgements and Faults to a Given Endpoint</b><a name="Getting_Acknowledgements_and_Faults_to_a_Given_Endpoint"></a></h3>
<p>In the default configuration, response path for acknowledgements and
faults related to a sequence is the anonymous endpoint. For example, HTTP
transport will send acknowledgements and faults in the HTTP response of
request messages. If you want to avoid this and if you want to get
acknowledgements and faults to a different endpoint, add following part to
the client code before doing any invocation. Note that this does not effect
the path of your application level faults. Only RM faults which occur within
the Sandesha2 will be sent to this endpoint.</p>
<div><pre>
clientOptions.setTransportInProtocol(org.apache.axis2.Constants.TRANSPORT_HTTP);
clientOptions.setProperty(SandeshaClientConstants.AcksTo,&lt;endpoint&gt;); //example endpoint - http://tempuri.org/acks.
</pre></div>
<a name="managing" id="managing"></a>
</div><div class="section"><h3><b>Managing Sequences</b><a name="Managing_Sequences"></a></h3>
<p>In the default behaviour Sandesha2 assumes that messages going to the same
endpoint should go in the same RM sequence. Messages will be sent in
different RM sequences only if their WS-Addressing To address is different.
But if required you can instruct Sandesha2 to send messages that have the
same WS-Addressing To address in two or more sequences. To do this you have
to set a property called Sequence Key.</p>
<div><pre>clientOptions.setProperty(SandeshaClientConstants.SEQUENCE_KEY,&lt;a string to identify the sequence&gt;);</pre></div>
<p>If the sequence key is different, Sandesha2 will send messages in two
sequences even if they are sent to the same endpoint.</p>
<a name="offering" id="offering"></a>
</div><div class="section"><h3>Offering a Sequence ID for the Response Sequence<a name="Offering_a_Sequence_ID_for_the_Response_Sequence"></a></h3>
<p>This is a concept of reliable messaging which may not be very useful to
you as a end user. Here what you do is offering a sequence ID for the
sequence to be created in the response side within the Create Sequence
Request message of the request path. If you provide this and if the Sandesha2
server accepts the offered sequence ID it can refrain from doing the Create
Sequence message exchange in the response path. To do this, add the following
to the client code.</p>
<div><pre>clientOptions.setProperty(SandeshaClientConstants.OFFERED_SEQUENCE_ID,&lt;new uuid&gt;);</pre></div>
<a name="creating" id="creating"></a>
</div><div class="section"><h3>Creating a Sequence Without Sending any Messages<a name="Creating_a_Sequence_Without_Sending_any_Messages"></a></h3>
<p>Sometimes you may need Sandesha2 client to start a sequence with a server
without sending any application messages. When you ask for this, Sandesha2
will do a Create Sequence message exchange and obtain a new sequence ID from
the server. The sequenceKey value of the newly created sequence will be
returned from this method which could be used do message invocations with it.
This method also has a boolean parameter which tells whether to offer a
sequence for the response side. (read the part on <a href="#oas">offering
sequence IDs</a> to learn more about offering sequences) . The line you have
to add to your client code for creating a sequence is as follows.</p>
<div><pre>String sequenceKey = SandeshaClient.createSequence (ServiceClient serviceClient, booleanoffer);</pre></div>
<p>There is an overloaded method of this which takes the sequenceKey from the
user.</p>
<div><pre>SandeshaClient.createSequnce (ServiceClient serviceClient, boolean offer,String sequenceKey);</pre></div>
<a name="ack_requests" id="ack_requests"></a>
</div><div class="section"><h3>Sending Acknowledgement Requests from the Client Code<a name="Sending_Acknowledgement_Requests_from_the_Client_Code"></a></h3>
<p>You can ask Sandesha2 to get an acknowledgement from a server with which
it is maintaining a sequence. This may be useful in a case where your <a href="#sequencereport">SequenceReports</a> indicate that some of the messages
you sent have not been acknowledged and when you want to verify that. You can
do this by adding following line to the client code.</p>
<div><pre>SandeshaClient.sendAckRequest (ServiceClient serviceClient);</pre></div>
<p>You can use following method to send an acknowledgement request to a
specific sequence identified by the Sequence Key.</p>
<div><pre>SandeshaClient.sendAckRequest (ServiceClient serviceClient, String sequenceKey);</pre></div>
<a name="terminating" id="terminating"></a>
</div><div class="section"><h3>Terminating a Sequence from the Client Code<a name="Terminating_a_Sequence_from_the_Client_Code"></a></h3>
<p>You can terminate an on going sequence at any time by adding the line
given in this section to your client code. Remember that if you terminate a
sequence some of your messages may not get delivered to the service.</p>
<div><pre>SandeshaClient.terminateSequence (ServiceClient serviceClient);</pre></div>
<p>To terminate a specific sequence identified by a sequenceKey use
following.</p>
<div><pre>SandeshaClient.terminateSequence (ServiceClient serviceClient, String sequenceKey);</pre></div>
<a name="closing" id="closing"></a>
</div><div class="section"><h3>Closing a Sequence from the Client Code<a name="Closing_a_Sequence_from_the_Client_Code"></a></h3>
<p>You can close an ongoing sequence at any time by adding the line given in
this section to your client code. Sequence close feature is only available
for new WSRM specification being developed under OASIS. Remember that if you
do not close elegantly, some of your messages may not get delivered to the
service. Again, see the section on <a href="#sequences">More about
sequences</a> for more details. You can issue following command from your
client code to close a sequence.</p>
<div><pre>SandeshaClient.closeSequence (ServiceClient serviceClient);</pre></div>
<p>To close a specific sequence identified by a sequence key use the
following</p>
<div><pre>SandeshaClient.closeSequence (ServiceClient serviceClient, String sequenceKey);</pre></div>
<a name="blocking" id="blocking"></a>
</div><div class="section"><h3>Blocking the Client Code until a Sequence is Complete<a name="Blocking_the_Client_Code_until_a_Sequence_is_Complete"></a></h3>
<p>After your client code delivered some messages to the RM layer, you may
have to wait for some time until the RM layer does its work. The time you
have to block depends on your system performance and network latencies. It
may be easier to ask the RM layer to block until its work is done by issuing
one of the following commands in your client code.</p>
<div><pre>SandeshaClient.waitUntilSequenceCompleted (ServiceClient serviceClient);
SandeshaClient.waitUntilSequenceCompleted (ServiceClient serviceClient, String sequenceKey);</pre></div>
<p>You can also give the maximum number of seconds the RM Layer should block.
The blocking will stop at the end of this maximum time even if the sequence
is not terminated or not timed out. But note that internally RM is still
working. So even though the blocking stops, RM layer will continue its work
until you exit the program.</p>
<div><pre>SandeshaClient.waitUntilSequenceCompleted (ServiceClient serviceClient, long maxWaitingTime);
SandeshaClient.waitUntilSequenceCompleted (ServiceClient serviceClient, long maxWaitingTime, String sequenceKey);</pre></div>
<a name="reports" id="reports"></a>
</div><div class="section"><h3>Working with Sandesha Reports<a name="Working_with_Sandesha_Reports"></a></h3>
<p>Sandesha introduces a feature called Sandesha Reports with which you can
get status information about the sequences managed by Sandesha2. There are
basically two kinds of reports, each explained in following subtopics.</p>
<a name="sandesha_reports" id="sandesha_reports"></a>
<div class="section"><h4>SandeshaReport<a name="SandeshaReport"></a></h4>
<p>This gives information on all the incoming and outgoing sequences
Sandesha2 system is managing. When we consider a particular endpoint, an
incoming sequence is a sequence to which that endpoint is working as a
RM-Destination (RMD). An outgoing sequence is a sequence to which this
endpoint works as a RM-Source (RMS).</p>
<p>A SandeshaReport include following information:</p>
<ul>
<li>Sequence IDs of all the outgoing sequences.</li>
<li>Number of completed messages of each outgoing sequences.</li>
<li>Sequence IDs of all the incoming sequences.</li>
<li>No of completed messages of each incoming sequence.</li>
</ul>
<p>To get a SandeshaReport at any time, invoke following method from your
client code.</p>
<div><pre>SandeshaClient.getSandeshaReport (ConfigurationContext c);</pre></div>
<a name="sequence_reports" id="sequence_reports"></a>
</div><div class="section"><h4>SequenceReport<a name="SequenceReport"></a></h4>
<p>A SequenceReport gives information on a specific sequences that a Sandesha
system is working on. This can be an incoming sequence or an outgoing
sequence.</p>
<p>A SequenceReport will give following information:</p>
<ol style="list-style-type: decimal">
<li>Status of the sequence which can be one of the following.
<ul>
<li>INITIAL - The sequence has not been established yet.</li>
<li>ESTABLISHED - Create Sequence / Create Sequence Response message
exchange has been done.</li>
<li>TERMINATED - The sequence has been terminated.</li>
<li>TIMEDOUT - The sequence has timed out.</li>
<li>UNKNOWN - The status cannot be determined.</li>
</ul>
</li>
<li>Sequence Direction
<ul>
<li>OUT - Outgoing sequence</li>
<li>IN - Incoming sequence</li>
</ul>
</li>
<li>Sequence ID of the sequence</li>
<li>Internal sequence ID of the sequence.</li>
<li>Number of completed messages of the sequence.</li>
</ol>
<p>A messages is considered as <b>completed</b> when a RMS has
successfully sent the message to the RMD and received an acknowledgement.</p>
<p>To get an incoming sequence report, you have to issue following command
from your client code.</p>
<div><pre>SandeshaClient.getIncomingSequenceReports (ConfigurationContext configCtx);</pre></div>
<p>To get an outgoing Sequence Report you can invoke any of the following
functions.</p>
<div><pre>SandeshaClient.getOutgoingSequenceReport (ServiceClient serviceClient);
SandeshaClient.getOutgoingSequenceReport (String to,String sequenceKey,ConfigurationContext configurationContext);
SandeshaClient.getOutgoingSequenceReport (String internalSequenceID,ConfigurationContext configurationContext);</pre></div>
<a name="listners" id="listners"></a>
</div></div><div class="section"><h3>Sandesha Listener Feature<a name="Sandesha_Listener_Feature"></a></h3>
<p>You can use this new feature to register a listener class in Sandesha2 and
get notified when specific event happens in the system. The basic interface
is given below.</p>
<div><pre>public interface SandeshaListener {
public void onError(AxisFault fault);
public void onTimeOut(SequenceReport report);
}</pre></div>
<p>You can implement this class and set an object of that type as a property
in the Options object in your client code. An example is given below.</p>
<div><pre>options.setProperty (SandeshaClientConstants.SANDESHA_LISTENER, new SandeshaListnerImpl ());</pre></div>
<p>Currently SandeshaListener defines the following two methods- onError
&amp; onTimedOut.</p>
<a name="on_error" id="on_error"></a>
</div><div class="section"><h3>onError<a name="onError"></a></h3>
<p>This will be invoked if Sandesha2 receives a fault SOAP message. The parameter will be an AxisFault
representing that fault message. this will be specially useful for capturing the faults that get returned
due to RM protocol messages, since they do not get returned to the client code.</p>
<a name="on_timeout" id="on_timeout"></a>
</div><div class="section"><h3>onTimeOut<a name="onTimeOut"></a></h3>
<p>As mentioned in the earlier section <a href="#smo">Sequence Management of
Sanesha2</a>, there is a possibility of an inactive sequence timing out. When
a specific sequence times out, this method of the SandeshaListener will be
invoked giving a report of that sequence as a parameter.</p>
<a name="sequences" id="sequences"></a>
</div><div class="section"><h2>More about sequences<a name="More_about_sequences"></a></h2>
<p>This section will explain you about the sequence management method of
Sandesha2. This is basically about four things, each explained in following
sub topics.</p>
<a name="creation" id="creation"></a>
<div class="section"><h3>Creation of sequences<a name="Creation_of_sequences"></a></h3>
<p>Sandesha client uses two properties given by the client to decide the
sequence in which it should send a particular application message. First one
is the address of the WS-Addressing To endpoint address. The second is a
special constant given by the client called Sequence Key which is set as a
property in the Options object as it was explained before. Sandesha2 client
generates a value called Internal Sequence ID by combining these two values.
All messages having the same Internal Sequence ID will be sent in a single
sequence, until that particular sequence is terminated.</p>
<p>Sequences that carry messages from the client to a server are called
request sequences and ones that carry messages from the server to the client
are called response sequences. Sandesha2 always keep a single response
sequence corresponding to a particular request sequence.</p>
<a name="termination" id="termination"></a>
</div><div class="section"><h3>Termination of sequences<a name="Termination_of_sequences"></a></h3>
<p>There are currently two methods to terminate a particular sequence from
the Client API. The first method is to <a href="#lastmessage">set the Last
Message property</a> as it was explained earlier. After all the messages up
to the last message get delivered reliably Sandesha2 will terminate that
sequence. Remember that if you are working on the Submitted WSRM
specification (the default), this is the only method you can use.</p>
<p>If you are working on the new WSRM specification (see previous section on
<a href="#sts">Selecting the Specification Version</a> if you want to know
how to set this), these is an alternate method you can use to terminate a
sequence. You can keep invoking the ServiceClient to send messages, without
setting a Last Message property. After you finish your work call following
function to terminate the sequence.</p>
<div><pre>SandeshaClient.terminateSequence (ServiceClient);</pre></div>
<p>You can use the function below to terminate a sequence identified by a
particular Sequence Key.</p>
<div><pre>SandeshaClient.terminateSequence (ServiceClient, SequenceKey);</pre></div>
<p>When a request sequence is terminated, Sandesha2 will wait till all the
response messages are reliably delivered to the client and after which will
terminate the response sequence as well.</p>
<a name="closing1" id="closing1"></a>
</div><div class="section"><h3>Closing of sequences<a name="Closing_of_sequences"></a></h3>
<p>New WSRM specification being developed under OASIS introduces a new
feature called closing a sequence. When a sequence is closed the server will
not except new application messages, but will accept RM control messages like
acknowledgement requests. If you are writing your code for this RM version
you can use following functions to close the current sequence.</p>
<div><pre>SandeshaClient.closeSequence (ServiceClient);</pre></div>
<p>You can use the function below to close a sequence identified by a
particular Sequence Key.</p>
<div><pre>SandeshaClient.terminateSequence (ServiceClient,, SequenceKey);</pre></div>
<a name="timing_out" id="timing_out"></a>
</div><div class="section"><h3>Timing Out a Sequence<a name="Timing_Out_a_Sequence"></a></h3>
<p>Depending on its policy configurations Sandesha2 may time out certain
sequences. After a sequence get timed out, it is considered finalized and
cannot be used any more. There are basically two ways a sequence can time
out, and both can be configured using policies. See '<a href="#inactivitytimeout">InactivityTimeout</a>' and '<a href="#maximumretransmissioncount">MaximumRetransmissionCount</a>' parts of
the '<a href="#cs">Configuring Sandesha2</a>' sub topic for more details.</p>
<a name="wws" id="wws"></a> <a name="delivary_assurances" id="delivary_assurances"></a>
</div><div class="section"><h2>Delivery Assurances of Sandesha2<a name="Delivery_Assurances_of_Sandesha2"></a></h2>
<p>As it was mentioned in the <a href="architectureGuide.html">Architecture
Guide</a>, Sandesha2 provide an in-order exactly-once delivery assurance.
<b>In-order</b> means that Sandesha2 will guarantee delivering of
the messages to the Web service in the order of their message numbers. If you
use a Sandesha2 client this will be the order you called the invocation
methods of your service client. <b>Exactly-once</b> delivery
assurance means that Sandesha2 will make sure that the service will be
invoked only once for each message. As it was mentioned earlier Sandesha2
retransmits messages to obtain reliability. Due to the exactly-once delivery
assurance you can be sure that your service gets invoked only once.</p>
<p>If you require the performance to be maximized and if you do not want
ordering, you can configure Sandesha2 to invoke messages in the order they
arrive. Read 'Configuring Sandesha2' section below to learn how to do
this.</p>
<a name="configuring" id="configuring"></a>
<div class="section"><h2>Configuring Sandesha2<a name="Configuring_Sandesha2"></a></h2>
<p>Sandesha2 provides a set of configurations which you can use to customize
its execution behavior. All these configurations are available in a WS-Policy
format. These policies can be in the module.xml file of the Sandesha module
or in the services.xml file of a service on which Sandesha2 module has been
engaged. Most of the policies in the module.xml can be overridden by setting
different values in a services.xml. But some policies cannot be overridden
and must be set correctly in the module.xml file.</p>
<p>You will find each Sandesha2 policy and the way an alteration of it can
effect Sandesha2. Make sure that you set these values carefully. Setting
incompatible types or values may cause Sandesha system to malfunction.
Normally if Sandesha2 can detect that the value you have set is incompatible,
it will set a default value which is mentioned in the SandeshaConstants
class.</p>
<a name="acknowledgementinterval" id="acknowledgementinterval"></a>
<div class="section"><h3>AcknowledgementInterval<a name="AcknowledgementInterval"></a></h3>
<p>When a RMD receives an application message and when it has to send
acknowledgements to an endpoint (other than the anonymous URL), it will not
send this message immediately but will wait for some time to see whether
there are any other messages (for example application response messages)
going towards the destination of the acknowledgement message. If it finds
any, the acknowledgement message is piggybacked in this second message and
both are sent together. If the RMD does not find any messages that go towards
the destination of the acknowledgement within a specific time interval, the
acknowledgement is sent as a stand alone message. This time interval is
called the <b>acknowledgement interval</b> and can be configured in
Sandesha2 policies. The measurement unit is in milliseconds.</p>
<a name="retransmissioninterval" id="retransmissioninterval"></a>
</div><div class="section"><h3>RetransmissionInterval<a name="RetransmissionInterval"></a></h3>
<p>As it was mentioned earlier some messages in RM should be retransmitted
until a proper response or acknowledgement is returned. After sending a
message once, the RMS will wait for some time before sending it for the
second time. This waiting time between the first and second retransmission
attempts is given by this policy. If the policy given later called the
ExponentialBackoff is set to false the time gap between all the
retransmissions attempts will have the same value, which is the
RetransmissionInterval. Measurement unit is in milliseconds.</p>
<a name="exponentialbackoff" id="exponentialbackoff"></a>
</div><div class="section"><h3>ExponentialBackoff<a name="ExponentialBackoff"></a></h3>
<p>Value of this can either be 'true' or 'false'. This measure is used to
adjust the retransmission attempts so that an RMD does not get flooded with a
large number of retransmitted messages. If this is 'true', a time gap between
two retransmissions will be twice as the time gap between previous two
retransmissions. For example, if the time gap between the fourth and fifth
retransmission attempts is twenty seconds the time gap between the fifth and
sixth attempts will be forty seconds. If this property is set to 'false', all
retransmissions will have the same value, which is given by the
'RetransmissionInterval' property.</p>
<a name="maximumretransmissioncount" id="maximumretransmissioncount"></a>
</div><div class="section"><h3>MaximumRetransmissionCount<a name="MaximumRetransmissionCount"></a></h3>
<p>This gives the maximum number of times a message has to be retransmitted.
When a specific message gets retransmitted a maximum number of times, and is
still not sent correctly to the RMD, it will not be sent again and the
request will be marked as Timed Out. When a sequence is timed out, it cannot
be used any more. If the value of this property is '-1' there is no limit in
the number of retransmission attempts.</p>
<a name="inactivitytimeout" id="inactivitytimeout"></a>
</div><div class="section"><h3>InactivityTimeout<a name="InactivityTimeout"></a></h3>
<p>A Sandesha2 RMS always keeps track of the last time a particular RMD
responded to a request by it. If the RMD does not response within the time
limit given by the time interval given by this measure, the RMS will give up
attempting and will mark the sequence as Timed Out. After timing out the
particular sequence, it cannot be used any more. If the value of this is -1,
there is not inactivity timeout limit The measure of this is given by the
property 'InactivityTimeoutMeasure'.</p>
<a name="inactivitytimeoutmeasure" id="inactivitytimeoutmeasure"></a>
</div><div class="section"><h3>InactivityTimeoutMeasure<a name="InactivityTimeoutMeasure"></a></h3>
<p>This gives the measure of the property 'InactivityTimeout'. The value of
this can be seconds, minutes, hours or days. If you give a value that cannot
be interpreted the default will be used.</p>
<a name="invokeinorder" id="invokeinorder"></a>
</div><div class="section"><h3>InvokeInOrder<a name="InvokeInOrder"></a></h3>
<p>As it was mentioned earlier, Sandesha2 implement the in-order invoking
delivery assurance. This property can be used to turn this on or off. The
value of this has to be 'true' if in-order invoking has to be enabled. It has
to be false if in-order invoking has to be disabled. Please remember that
this is a non-overridable property. I.e. value you set in the module.xml is
the one that is used for all the services and will not be overridden for a
particular service by setting a different value there.</p>
<a name="storagemanagers" id="storagemanagers"></a>
</div><div class="section"><h3>StorageManagers<a name="StorageManagers"></a></h3>
<p>This gives the storage manager implementation classes used by Sandesha2.
You have to mention the full qualified class name here.</p>
<p>You can basically define two StorageManagers</p>
<p>InMemoryStorageManager - Expected to store data in memory. Supposed to be
faster.</p>
<p>PermanentStorageManager - Will be storing data in a database. So will be
little slower but real business applications will most probably prefer this
could provide additional features like recovery from failures.</p>
<p>Only one of these StorageManagers will be active in a given Sandesha2
instance. By default it will be the InMemorystoragemanager. If you want to
make the PermanentStoragemanager active add the following property to the
axis2.xml.</p>
<p>&lt;parameter name=&quot;Sandesha2StorageManager&quot;
locked=&quot;false&quot;&gt;persistent&lt;/parameter&gt;</p>
<p>StorageManager property is not overridable, i.e., value you set in the
module.xml is the one that is used for all the services and will not be
overridden for a particular service by setting a different value there.</p>
You can easily create your own Storage Manager. Please read the Sandesha2 <a href="architectureGuide.html">Architecture Guide</a> for more details on
this. <a name="messagetypestodrop" id="messagetypestodrop"></a>
</div><div class="section"><h3>MessageTypesToDrop<a name="MessageTypesToDrop"></a></h3>
<p>This is a property that may not be very useful to an end user, but may be
useful for some debug purposes. As it was mentioned earlier Sandesha2 gives a
Message Type to each message it sends. For example, Create Sequence messages
will have the type 1 and Acknowledgement messages will have the type 4. You
can add a comma separated list of integers in the property telling Sandesha2
not to send messages of those types.</p>
<a name="securitymanager" id="securitymanager"></a>
</div><div class="section"><h3>SecurityManager<a name="SecurityManager"></a></h3>
<p>The security manager allows you to plug a certain Secure Conversation
implemenation into axis2. The default is a DummySecurityManager which does
not do any real work. We have also implemented a RamaprtBasedSecurityManager
which allows you to use Rampart as your secure conversation
implementation.</p>
<p>To use the rampart follow the below steps.</p>
<ol style="list-style-type: decimal">
<li><p>Add the wss4j jar file (wss4j-VERSION.jar) to your to your
CLASSPATH. (If your are in the server side add this to the WEB-INF/lib
folder of the Axis2 webapp).</p>
</li>
<li><p>Add the Rampart and Rahas modules to the Axis2 modules directory.</p>
</li>
<li><p>Change the SecurityManager policy of the Sandesha2 module.xml to the
following</p>
<p>org.apache.sandesha2.security.rampart.RampartBasedSecurityManager</p>
</li>
</ol>
</div>
</html>
</div>
</div>
<div class="clear">
<hr/>
</div>
<div id="footer">
<div class="xright">
Copyright &#169; 2005-2013
<a href="http://www.apache.org/">The Apache Software Foundation</a>.
All Rights Reserved.
</div>
<div class="clear">
<hr/>
</div>
</div>
</body>
</html>