[esb-java-dev] svn commit r233 - in esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send: . algorithms list/factories list/failover list/sessionless senders

svn at wso2.com svn at wso2.com
Fri Dec 15 00:05:03 PST 2006


Author: chathura
Date: Fri Dec 15 00:04:59 2006
New Revision: 233

Modified:
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/ESBSendMediator.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/ESBSendMediatorFactory.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/ESBSendMediatorSerializer.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/EndpointWrapper.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/FailoverManager.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/LoadbalanceAlgorithm.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/LoadbalanceManager.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/Node.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/algorithms/RoundRobin.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/factories/ListBasedFailoverManagerFactory.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/factories/ListBasedLoadbalanceManagerFactory.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/factories/LoadbalanceAlgorithmFactory.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/failover/FailoverRefresher.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/failover/ListBasedFailoverManager.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/sessionless/ListBasedLoadbalancer.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/sessionless/LoadbalanceRefresher.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/AbstractSender.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/FailoverSender.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/LoadbalanceSender.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/LoadbalanceWithFailoverSender.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/Sender.java
   esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/SimpleSender.java
Log:
Added functionality to specify maximum number of retries and the interval between retries in the load balancing and failover. Improvements and more decriptive comments are also added.

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/ESBSendMediator.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/ESBSendMediator.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/ESBSendMediator.java	Fri Dec 15 00:04:59 2006
@@ -19,17 +19,12 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 import org.apache.synapse.MessageContext;
-import org.apache.synapse.config.SynapseConfiguration;
-import org.apache.synapse.config.Property;
 import org.apache.synapse.mediators.AbstractMediator;
 import org.wso2.esb.mediators.send.senders.Sender;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: Nov 18, 2006
- * Time: 6:06:12 PM
- * To change this template use File | Settings | File Templates.
+ * This is the send mediator for ESB. It just invokes the send method of its sender. Sender handles
+ * all sending patterns.
  */
 public class ESBSendMediator extends AbstractMediator {
 
@@ -40,8 +35,6 @@
 
     public boolean mediate(MessageContext synapseMsgContext) {
 
-
-
         if(synapseMsgContext.isResponse()) {
             synapseMsgContext.getEnvironment().send(synapseMsgContext);
             return false;

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/ESBSendMediatorFactory.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/ESBSendMediatorFactory.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/ESBSendMediatorFactory.java	Fri Dec 15 00:04:59 2006
@@ -34,20 +34,52 @@
 import org.apache.synapse.config.xml.MediatorFactory;
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMAttribute;
-import org.apache.axiom.om.OMException;
 
 import java.util.Iterator;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: Nov 18, 2006
- * Time: 6:10:06 PM
- * To change this template use File | Settings | File Templates.
+ * Factory of the ESBSendMediator. It only supports the complete creation of simple sender.
+ * It delegates creation of complex senders to thier corresponding factory.
+ *
+ * In the simplest case, the message is sent to a single endpoint.
+ *
+ * <esb:send>
+ * (endpointref | endpoint)
+ * </esb:send>
+ *
+ * For load balancing among set of endpoints use:
+ *
+ * <esb:send>
+ * <esb:loadbalance algorithm="algorithm name" failover="true|false" retryAfterFailure="time in milliseconds">
+ * (endpointref | endpoint)+
+ * </esb:loadbalance>
+ * </esb:send>
+ *
+ * algorithm attribute is used to specify the loadbalance algorithm. Currently only the round robin
+ * algorithm is supported. If algorithm is not specified, round robin is used as default.
+ *
+ * If failover attribute is set to true, the message will be directed to the next node, if the
+ * current node is failing. If it is false, an execption will be returned to invoker. Default is
+ * true.
+ *
+ * When a node is detected as failed it is abandoned for subsequent requests for the time specified
+ * by the retryAfterFailure attribute.
+ *
+ * For failover among set of endpoints use:
+ *
+ * <esb:send>
+ * <esb:failover retryAfterFailure="time in milliseconds">
+ * (endpointref | endpoint)+
+ * </esb:failover>
+ * </esb:send>
+ *
+ * When a node is detected as failed it is abandoned for subsequent requests for the time specified
+ * by the retryAfterFailure attribute.
+ *
  */
 public class ESBSendMediatorFactory implements MediatorFactory {
 
-    private static final QName SEND = new QName(Constants.ESB_XML_NAMESPACE, "send");
+    private static final QName SEND = new QName(Constants.ESB_XML_NAMESPACE, Constants.ESBSEND_ELEMENT);
 
     private static final QName ATT_REF_Q = new QName(org.apache.synapse.config.xml.Constants.NULL_NAMESPACE, "ref");
     private static final QName ATT_ADDRESS_Q = new QName(org.apache.synapse.config.xml.Constants.NULL_NAMESPACE, "address");
@@ -63,7 +95,8 @@
         ESBSendMediator esbSendMediator = new ESBSendMediator();
 
         // handle the simple send scenario
-        Iterator endpointIterator = element.getChildrenWithName(new QName(Constants.ESB_XML_NAMESPACE, "endpoint"));
+        Iterator endpointIterator = element.getChildrenWithName
+                (org.apache.synapse.config.xml.Constants.ENDPOINT_ELT);
         if(endpointIterator.hasNext()) {
 
             SimpleSender simpleSender = new SimpleSender();
@@ -90,7 +123,9 @@
 
         // handler the loadbalance scenario
         OMElement loadbalanceElement =  null;
-        loadbalanceElement = element.getFirstChildWithName(new QName(Constants.ESB_XML_NAMESPACE, "loadbalance"));
+        loadbalanceElement = element.getFirstChildWithName
+                (new QName(Constants.ESB_XML_NAMESPACE, Constants.LOADBALANCE_ELEMENT));
+
         if(loadbalanceElement != null) {
 
             ListBasedLoadbalanceManagerFactory factory = new ListBasedLoadbalanceManagerFactory();
@@ -98,18 +133,42 @@
             LoadbalanceAlgorithm algorithm = LoadbalanceAlgorithmFactory.createLoadbalanceAlgorithm(loadbalanceElement, loadbalanceManager.getEndpoints());
             loadbalanceManager.setAlgorithm(algorithm);
 
+            long retryInterval = 30000;
+            OMAttribute riAttribute = loadbalanceElement.getAttribute
+                    (new QName(null, Constants.RETRY_INTERVAL));
+
+            if(riAttribute != null) {
+                String ri = riAttribute.getAttributeValue();
+                retryInterval = Long.parseLong(ri);
+            }
+
+            int maximumRetries = 0;
+            OMAttribute mrAttribute = loadbalanceElement.getAttribute
+                    (new QName(null, Constants.MAXIMUM_RETRIES));
+
+            if(mrAttribute != null) {
+                String mr = mrAttribute.getAttributeValue();
+                maximumRetries = Integer.parseInt(mr);
+            }
+
             // decide whether we should support failover or not
-            OMAttribute foAttribute = loadbalanceElement.getAttribute(new QName(null, "failover"));
+            OMAttribute foAttribute = loadbalanceElement.getAttribute
+                    (new QName(null, Constants.FAILOVER));
+
             if(foAttribute != null) {
                 String fo = foAttribute.getAttributeValue();
 
                 if(fo.equalsIgnoreCase("true")) {
                     LoadbalanceWithFailoverSender loadbalanceWithFailoverSender = new LoadbalanceWithFailoverSender();
                     loadbalanceWithFailoverSender.setLoadbalanceManager(loadbalanceManager);
+                    loadbalanceWithFailoverSender.setMaximumRetries(maximumRetries);
+                    loadbalanceWithFailoverSender.setRetryInterval(retryInterval);
                     esbSendMediator.setSender(loadbalanceWithFailoverSender);
                 } else {
                     LoadbalanceSender loadbalanceSender = new LoadbalanceSender();
                     loadbalanceSender.setLoadbalanceManager(loadbalanceManager);
+                    loadbalanceSender.setMaximumRetries(maximumRetries);
+                    loadbalanceSender.setRetryInterval(retryInterval);
                     esbSendMediator.setSender(loadbalanceSender);
                 }
 
@@ -117,19 +176,42 @@
                 // by default, set failover to true
                 LoadbalanceWithFailoverSender loadbalanceWithFailoverSender = new LoadbalanceWithFailoverSender();
                 loadbalanceWithFailoverSender.setLoadbalanceManager(loadbalanceManager);
+                loadbalanceWithFailoverSender.setMaximumRetries(maximumRetries);
+                loadbalanceWithFailoverSender.setRetryInterval(retryInterval);
                 esbSendMediator.setSender(loadbalanceWithFailoverSender);
             }
         }
 
         // handle the failover scenario
-        OMElement failoverElement =  element.getFirstChildWithName(new QName(Constants.ESB_XML_NAMESPACE, "failover"));
+        OMElement failoverElement =  element.getFirstChildWithName
+                (new QName(Constants.ESB_XML_NAMESPACE, Constants.FAILOVER_ELEMENT));
+
         if(failoverElement != null) {
 
+            long retryInterval = 30000;
+            OMAttribute riAttribute = failoverElement.getAttribute
+                    (new QName(null, Constants.RETRY_INTERVAL));
+            if(riAttribute != null) {
+                String ri = riAttribute.getAttributeValue();
+                retryInterval = Long.parseLong(ri);
+            }
+
+            int maximumRetries = 0;
+            OMAttribute mrAttribute = failoverElement.getAttribute
+                    (new QName(null, Constants.MAXIMUM_RETRIES));
+            if(mrAttribute != null) {
+                String mr = mrAttribute.getAttributeValue();
+                maximumRetries = Integer.parseInt(mr);
+            }
+
             // failover send
             FailoverSender sender = new FailoverSender();
-            org.wso2.esb.mediators.send.list.factories.ListBasedFailoverManagerFactory factory = new org.wso2.esb.mediators.send.list.factories.ListBasedFailoverManagerFactory();
+            org.wso2.esb.mediators.send.list.factories.ListBasedFailoverManagerFactory factory =
+                    new org.wso2.esb.mediators.send.list.factories.ListBasedFailoverManagerFactory();
             FailoverManager failoverManager = factory.createFailoverManager(failoverElement);
             sender.setFailoverManager(failoverManager);
+            sender.setMaximumRetries(maximumRetries);
+            sender.setRetryInterval(retryInterval);
             esbSendMediator.setSender(sender);
         }
 
@@ -144,7 +226,8 @@
 
         ESBSendMediator sm =  new ESBSendMediator();
 
-        Iterator iter = element.getChildrenWithName(new QName(Constants.ESB_XML_NAMESPACE, "endpoint"));
+        Iterator iter = element.getChildrenWithName
+                (org.apache.synapse.config.xml.Constants.ENDPOINT_ELT);
         while (iter.hasNext()) {
 
             OMElement endptElem = (OMElement) iter.next();

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/ESBSendMediatorSerializer.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/ESBSendMediatorSerializer.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/ESBSendMediatorSerializer.java	Fri Dec 15 00:04:59 2006
@@ -17,7 +17,6 @@
 package org.wso2.esb.mediators.send;
 
 import org.apache.synapse.config.xml.MediatorSerializer;
-import org.apache.synapse.config.xml.EndpointSerializer;
 import org.apache.synapse.config.xml.BaseMediatorSerializer;
 import org.apache.synapse.config.Endpoint;
 import org.apache.synapse.Mediator;
@@ -25,22 +24,18 @@
 import org.apache.axiom.om.OMElement;
 import org.apache.axiom.om.OMNamespace;
 
-import java.util.Iterator;
 import java.util.ArrayList;
 
 import org.wso2.esb.Constants;
 import org.wso2.esb.mediators.send.senders.*;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: 27/10/2006
- * Time: 12:25:58
- * To change this template use File | Settings | File Templates.
+ * This is the serailizer of the ESBSendMediator.
  */
 public class ESBSendMediatorSerializer extends BaseMediatorSerializer implements MediatorSerializer {
 
-    private static final OMNamespace esbNamspace = fac.createOMNamespace(Constants.ESB_XML_NAMESPACE, "esb");
+    private static final OMNamespace esbNamspace =
+            fac.createOMNamespace(Constants.ESB_XML_NAMESPACE, "esb");
 
     public OMElement serializeMediator(OMElement parent, Mediator m) {
 
@@ -49,7 +44,7 @@
         }
 
         ESBSendMediator esbSendMediator = (ESBSendMediator)m;
-        OMElement esbSend = fac.createOMElement("send", esbNamspace);
+        OMElement esbSend = fac.createOMElement(Constants.ESBSEND_ELEMENT, esbNamspace);
 
         Object o = esbSendMediator.getSender();
 
@@ -63,12 +58,20 @@
             LoadbalanceSender loadbalanceSender = (LoadbalanceSender) o;
             LoadbalanceManager manager = loadbalanceSender.getLoadbalanceManager();
 
-            OMElement lbElement = fac.createOMElement("loadbalance", esbNamspace);
-            lbElement.addAttribute("failover", "false", null);
+            OMElement lbElement = fac.createOMElement(Constants.LOADBALANCE_ELEMENT, esbNamspace);
+            lbElement.addAttribute(Constants.FAILOVER, "false", null);
 
             long abandonTime = manager.getAbandonTime();
             String strAbandonTime = new Long(abandonTime).toString();
-            lbElement.addAttribute("abandon_time", strAbandonTime, null);
+            lbElement.addAttribute(Constants.RETRY_AFTER_FAILURE_TIME, strAbandonTime, null);
+
+            long retryInterval = loadbalanceSender.getRetryInterval();
+            String strRetryInterval = new Long(retryInterval).toString();
+            lbElement.addAttribute(Constants.RETRY_INTERVAL, strRetryInterval, null);
+
+            int maximumRetries = loadbalanceSender.getMaximumRetries();
+            String strMaximumRetries = new Integer(maximumRetries).toString();
+            lbElement.addAttribute(Constants.MAXIMUM_RETRIES, strMaximumRetries, null);
 
             ArrayList endpointList = manager.getEndpoints();
             for(int i=0; i<endpointList.size(); i++) {
@@ -84,12 +87,20 @@
                     (LoadbalanceWithFailoverSender) o;
             LoadbalanceManager manager = loadbalanceWithFailoverSender.getLoadbalanceManager();
 
-            OMElement lbElement = fac.createOMElement("loadbalance", esbNamspace);
-            lbElement.addAttribute("failover", "true", null);
+            OMElement lbElement = fac.createOMElement(Constants.LOADBALANCE_ELEMENT, esbNamspace);
+            lbElement.addAttribute(Constants.FAILOVER, "true", null);
 
             long abandonTime = manager.getAbandonTime();
             String strAbandonTime = new Long(abandonTime).toString();
-            lbElement.addAttribute("abandon_time", strAbandonTime, null);
+            lbElement.addAttribute(Constants.RETRY_AFTER_FAILURE_TIME, strAbandonTime, null);
+
+            long retryInterval = loadbalanceWithFailoverSender.getRetryInterval();
+            String strRetryInterval = new Long(retryInterval).toString();
+            lbElement.addAttribute(Constants.RETRY_INTERVAL, strRetryInterval, null);
+
+            int maximumRetries = loadbalanceWithFailoverSender.getMaximumRetries();
+            String strMaximumRetries = new Integer(maximumRetries).toString();
+            lbElement.addAttribute(Constants.MAXIMUM_RETRIES, strMaximumRetries, null);
 
             ArrayList endpointList = manager.getEndpoints();
             for(int i=0; i<endpointList.size(); i++) {
@@ -105,11 +116,19 @@
             FailoverSender failoverSender = (FailoverSender) o;
             FailoverManager manager = failoverSender.getFailoverManager();
 
-            OMElement foElement = fac.createOMElement("failover", esbNamspace);
+            OMElement foElement = fac.createOMElement(Constants.FAILOVER_ELEMENT, esbNamspace);
 
             long abandonTime = manager.getAbandonTime();
             String strAbandonTime = new Long(abandonTime).toString();
-            foElement.addAttribute("abandon_time", strAbandonTime, null);
+            foElement.addAttribute(Constants.RETRY_AFTER_FAILURE_TIME, strAbandonTime, null);
+
+            long retryInterval = failoverSender.getRetryInterval();
+            String strRetryInterval = new Long(retryInterval).toString();
+            foElement.addAttribute(Constants.RETRY_INTERVAL, strRetryInterval, null);
+
+            int maximumRetries = failoverSender.getMaximumRetries();
+            String strMaximumRetries = new Integer(maximumRetries).toString();
+            foElement.addAttribute(Constants.MAXIMUM_RETRIES, strMaximumRetries, null);
 
             ArrayList endpointList = manager.getEndpoints();
             for(int i=0; i<endpointList.size(); i++) {
@@ -129,7 +148,7 @@
 
     private OMElement serializeEndpoint(Endpoint endpoint) {
 
-        OMElement endpointElement = fac.createOMElement("endpoint", esbNamspace);
+        OMElement endpointElement = fac.createOMElement("endpoint", null);
         if (endpoint.getAddress() != null) {
             endpointElement.addAttribute("address", endpoint.getAddress(), null);
         } else if (endpoint.getRef() != null) {

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/EndpointWrapper.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/EndpointWrapper.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/EndpointWrapper.java	Fri Dec 15 00:04:59 2006
@@ -19,11 +19,9 @@
 import org.apache.synapse.config.Endpoint;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: 2/11/2006
- * Time: 13:48:28
- * To change this template use File | Settings | File Templates.
+ * This is a wrapper class for syanapse endpoint to provide additional features required for
+ * esb failure recovery. It has functionality to store the state (active/inactive) of the
+ * endpoint.
  */
 public class EndpointWrapper implements Node {
 

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/FailoverManager.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/FailoverManager.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/FailoverManager.java	Fri Dec 15 00:04:59 2006
@@ -16,35 +16,52 @@
 
 package org.wso2.esb.mediators.send;
 
-import org.apache.synapse.config.Endpoint;
 import org.apache.synapse.SynapseException;
 import org.apache.synapse.MessageContext;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: 27/10/2006
- * Time: 18:56:35
- * To change this template use File | Settings | File Templates.
+ * All failover managers should implement this interface.
  */
 public interface FailoverManager {
 
-    public void setEndpoints(ArrayList endpoints);
-
+    /**
+     * Returns the list of endpoints currently used for fail over.
+     *
+     * @return List of end points used for fail over
+     */
     public ArrayList getEndpoints();
 
+    /**
+     * Sets the endpoints for fail over.
+     *
+     * @param endpoints List of endpoints to be used for fail over
+     */
+    public void setEndpoints(ArrayList endpoints);
+
+    /**
+     * After an endpoint is detected as failed, they are abandoned for subsequent requests for a
+     * time specified by the abandon time. This function is used to get the abandon time for the
+     * serialization purpose.
+     *
+     * @return Abandon time in milliseconds
+     */
     public long getAbandonTime();
 
+    /**
+     *  This function is used at the creation of ESB send mediator to set the abandon time.
+     *
+      * @param abandonTime Abandon time in milliseconds
+     */
     public void setAbandonTime(long abandonTime);
 
-    public HashMap getFailedEndpoints();
-
-    public void activateEndpoint(Endpoint endpoint);
-
-    public void deactivateEndpoint(Endpoint endpoint);
-
+    /**
+     * This function is used to get the next end point to direct the request. SynapseMessageContext
+     * has to be supplied for this method to support session affinity.
+     *
+     * @param synapseMessageContext SynapseMessageContext for the current message
+     * @return EndpointWrapper containing the end point
+     */
     public EndpointWrapper getEndpoint(MessageContext synapseMessageContext) throws SynapseException;
 }

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/LoadbalanceAlgorithm.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/LoadbalanceAlgorithm.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/LoadbalanceAlgorithm.java	Fri Dec 15 00:04:59 2006
@@ -19,15 +19,21 @@
 import org.apache.synapse.MessageContext;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: Nov 19, 2006
- * Time: 5:40:41 PM
- * To change this template use File | Settings | File Templates.
+ * All load balance algorithms must implement this interface. Implementations of this interface can
+ * be registered in LoadbalanceManagers.
  */
 public interface LoadbalanceAlgorithm {
 
+    /**
+     * This method returns the next node according to the algorithm implementation.
+     *
+     * @param synapseMessageContext SynapseMessageContext of the current message
+     * @return Next node for directing the message
+     */
     public Node getNextEndpoint(MessageContext synapseMessageContext);
 
+    /**
+     * Resets the algorithm to its initial position. Initial position depends on the implementation.
+     */
     public void reset();
 }

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/LoadbalanceManager.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/LoadbalanceManager.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/LoadbalanceManager.java	Fri Dec 15 00:04:59 2006
@@ -16,40 +16,75 @@
 
 package org.wso2.esb.mediators.send;
 
-import org.apache.synapse.config.Endpoint;
 import org.apache.synapse.MessageContext;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: 27/10/2006
- * Time: 11:57:44
- * To change this template use File | Settings | File Templates.
+ * Any load balance manager must implement this interface. Implementation of LoadbalanceManager can
+ * be used with either LoadbalanceSender or LoadbalanceWithFailoverSender to achive desired
+ * functionality.
  */
 public interface LoadbalanceManager {
 
-    public void setEndpoints(ArrayList endpoints);
-
+    /**
+     * Returns the list of endpoints currently used for load balancing. Contents of the list depends
+     * on the implementation. LoadbalanceManager implementation must interpret the list correctly.
+     *
+     * @return List of end points used for load balancing
+     */
     public ArrayList getEndpoints();
 
-    public HashMap getFailedEndpoints();
-
-    public void activateEndpoint(Endpoint endpoint);
-
-    public void deactivateEndpoint(Endpoint endpoint);
+    /**
+     * Sets the endpoints for load balancing. Contents of the list depends on the implementation.
+     * LoadbalanceManager implementation must interpret the list correctly.
+     *
+     * @param endpoints List of endpoints to be used for load balancing
+     */
+    public void setEndpoints(ArrayList endpoints);
 
+    /**
+     * Returns the LoadbalanceAlgorithm implementation currently used for load balancing. This is
+     * useful for serializing the ESB send mediators.
+     *
+     * @return The LoadbalanceAlgorithm implementation currently used for load balancing
+     */
     public LoadbalanceAlgorithm getAlgorithm();
 
+    /**
+     * Sets the LoadbalanceAlgorithm implementation for load balancing. This is called at the
+     * creation of the ESB send mediator.
+     *
+     * @param loadbalanceAlgorithm LoadbalanceAlgorithm implementation for load balancing
+     */
     public void setAlgorithm(LoadbalanceAlgorithm loadbalanceAlgorithm);
 
+    /**
+     * After an endpoint is detected as failed, they are abandoned for subsequent requests for a
+     * time specified by the abandon time. This function is used to get the abandon time for the
+     * serialization purpose.
+     *
+     * @return Abandon time in milliseconds
+     */
     public long getAbandonTime();
 
+    /**
+     *  This function is used at the creation of ESB send mediator to set the abandon time.
+     *
+      * @param abandonTime Abandon time in milliseconds
+     */
     public void setAbandonTime(long abandonTime);
 
     // we need message context to support session affinity
+
+    /**
+     * This function is used to get the next end point to direct the request. This must return a
+     * EndpointWrapper object regardless of the internal representation of the endpoints.
+     * SynapseMessageContext has to be supplied for this method to support session affinity.
+     *
+     * @param synapseMessageContext SynapseMessageContext for the current message
+     * @return EndpointWrapper containing the end point
+     */
     public EndpointWrapper getEndpoint(MessageContext synapseMessageContext);
 
 //    public void updateSessionMap(MessageContext synapseMessageContext);

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/Node.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/Node.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/Node.java	Fri Dec 15 00:04:59 2006
@@ -17,16 +17,10 @@
 package org.wso2.esb.mediators.send;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: Nov 19, 2006
- * Time: 8:14:01 PM
- * To change this template use File | Settings | File Templates.
+ * This is abstract representation of an end point. This may represent an EndpointWrapper or an
+ * collection of EndpointWrappers.
  */
 public interface Node {
-
     // for now this is an empty interface
     // we may add a property bag latter to support other loadbalance algorithms
-
-
 }

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/algorithms/RoundRobin.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/algorithms/RoundRobin.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/algorithms/RoundRobin.java	Fri Dec 15 00:04:59 2006
@@ -17,18 +17,15 @@
 package org.wso2.esb.mediators.send.algorithms;
 
 import org.wso2.esb.mediators.send.LoadbalanceAlgorithm;
-import org.wso2.esb.mediators.send.EndpointWrapper;
 import org.wso2.esb.mediators.send.Node;
 import org.apache.synapse.MessageContext;
 
 import java.util.ArrayList;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: Nov 19, 2006
- * Time: 5:44:44 PM
- * To change this template use File | Settings | File Templates.
+ * Implematation of the round robin load balance algorithm. ArrayList of endpoints has to supplied
+ * at the instantiation. Then it gives the nodes in the round robin manner, for each invocation of
+ * the getNextEndpoint method.
  */
 public class RoundRobin implements LoadbalanceAlgorithm {
 

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/factories/ListBasedFailoverManagerFactory.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/factories/ListBasedFailoverManagerFactory.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/factories/ListBasedFailoverManagerFactory.java	Fri Dec 15 00:04:59 2006
@@ -29,30 +29,33 @@
 import java.util.Iterator;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: Nov 19, 2006
- * Time: 12:48:23 PM
- * To change this template use File | Settings | File Templates.
+ * Factory of the FailoverManager. ESBSendMediatorFactory will delegate the creation of the
+ * FailoverManager if it detects that the configuration has a &lt;failover&gt; element.
  */
 public class ListBasedFailoverManagerFactory {
 
-    private static final QName ATT_REF_Q = new QName(org.apache.synapse.config.xml.Constants.NULL_NAMESPACE, "ref");
-    private static final QName ATT_ADDRESS_Q = new QName(org.apache.synapse.config.xml.Constants.NULL_NAMESPACE, "address");
+    private static final QName ATT_REF_Q =
+            new QName(org.apache.synapse.config.xml.Constants.NULL_NAMESPACE, "ref");
+
+    private static final QName ATT_ADDRESS_Q =
+            new QName(org.apache.synapse.config.xml.Constants.NULL_NAMESPACE, "address");
 
     public ListBasedFailoverManager createFailoverManager(OMElement failoverElement) {
 
         ListBasedFailoverManager failoverManager = new ListBasedFailoverManager();
 
         long abandonTime = 0;
-        OMAttribute atAttribute = failoverElement.getAttribute(new QName(null, "abandon_time"));
+        OMAttribute atAttribute = failoverElement.getAttribute
+                (new QName(null, Constants.RETRY_AFTER_FAILURE_TIME));
         if(atAttribute != null) {
             String at = atAttribute.getAttributeValue();
             abandonTime = Long.parseLong(at);
         }
 
         ArrayList endpList = new ArrayList();
-        Iterator iter = failoverElement.getChildrenWithName(new QName(Constants.ESB_XML_NAMESPACE, "endpoint"));
+        Iterator iter = failoverElement.getChildrenWithName
+                (org.apache.synapse.config.xml.Constants.ENDPOINT_ELT);
+
         while (iter.hasNext()) {
 
             OMElement endptElem = (OMElement) iter.next();

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/factories/ListBasedLoadbalanceManagerFactory.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/factories/ListBasedLoadbalanceManagerFactory.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/factories/ListBasedLoadbalanceManagerFactory.java	Fri Dec 15 00:04:59 2006
@@ -29,30 +29,31 @@
 import java.util.Iterator;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: Nov 19, 2006
- * Time: 12:39:17 PM
- * To change this template use File | Settings | File Templates.
+ * Factory of the LoadbalanceManager. ESBSendMediatorFactory will delegate the creation of the
+ * FailoverManager if it detects that the configuration has a &lt;loadbalance&gt; element.
  */
 public class ListBasedLoadbalanceManagerFactory {
 
-    private static final QName ATT_REF_Q = new QName(org.apache.synapse.config.xml.Constants.NULL_NAMESPACE, "ref");
-    private static final QName ATT_ADDRESS_Q = new QName(org.apache.synapse.config.xml.Constants.NULL_NAMESPACE, "address");
+    private static final QName ATT_REF_Q =
+            new QName(org.apache.synapse.config.xml.Constants.NULL_NAMESPACE, "ref");
+    private static final QName ATT_ADDRESS_Q =
+            new QName(org.apache.synapse.config.xml.Constants.NULL_NAMESPACE, "address");
 
     public ListBasedLoadbalancer createLoadbalanceManager(OMElement loadbalanceElement) {
 
         ListBasedLoadbalancer loadbalanceManager = new ListBasedLoadbalancer();
 
         long abandonTime = 0;
-        OMAttribute atAttribute = loadbalanceElement.getAttribute(new QName(null, "abandon_time"));
+        OMAttribute atAttribute = loadbalanceElement.getAttribute
+                (new QName(null, Constants.RETRY_AFTER_FAILURE_TIME));
         if(atAttribute != null) {
             String at = atAttribute.getAttributeValue();
             abandonTime = Long.parseLong(at);
         }
 
         ArrayList endpList = new ArrayList();
-        Iterator iter = loadbalanceElement.getChildrenWithName(new QName(Constants.ESB_XML_NAMESPACE, "endpoint"));
+        Iterator iter = loadbalanceElement.getChildrenWithName
+                (org.apache.synapse.config.xml.Constants.ENDPOINT_ELT);
         while (iter.hasNext()) {
 
             OMElement endptElem = (OMElement) iter.next();

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/factories/LoadbalanceAlgorithmFactory.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/factories/LoadbalanceAlgorithmFactory.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/factories/LoadbalanceAlgorithmFactory.java	Fri Dec 15 00:04:59 2006
@@ -25,11 +25,8 @@
 import java.util.ArrayList;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: Nov 19, 2006
- * Time: 7:47:17 PM
- * To change this template use File | Settings | File Templates.
+ * Factroy of all load balance algorithms. ESBSendMediatorFactroy will use this to create the
+ * appropriate algorithm implementation.
  */
 public class LoadbalanceAlgorithmFactory {
 

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/failover/FailoverRefresher.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/failover/FailoverRefresher.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/failover/FailoverRefresher.java	Fri Dec 15 00:04:59 2006
@@ -19,27 +19,23 @@
 import org.wso2.esb.mediators.send.FailoverManager;
 import org.wso2.esb.mediators.send.EndpointWrapper;
 
-import java.util.HashMap;
 import java.util.Iterator;
 
-import org.apache.synapse.config.Endpoint;
-
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: 31/10/2006
- * Time: 20:29:55
- * To change this template use File | Settings | File Templates.
+ * This is used by the FailoverManager to refresh its endpoints. This will periodically iterates
+ * through the endpoint list and activates the deactivated endpoints. The interval between
+ * iterations is specified by the abandonTime parameter supplied for the constructor.
+ *
+ * It does not check the state of the actual endpoint. Therefore, the endpoint may still remain
+ * failed.
  */
 public class FailoverRefresher extends Thread {
 
-//    private HashMap failedEndpoints = null;
     private long abandonTime = 0;
     private long sleepTime = 0;
     private FailoverManager failoverManager = null;
 
     public FailoverRefresher(FailoverManager failoverManager, long abandonTime, long sleepTime) {
-//        this.failedEndpoints = failoverManager.getFailedEndpoints();
         this.abandonTime = abandonTime;
         this.sleepTime =sleepTime;
         this.failoverManager = failoverManager;
@@ -49,15 +45,6 @@
 
         while(true) {
 
-//            Iterator endpointIterator = failedEndpoints.keySet().iterator();
-//            while(endpointIterator.hasNext()) {
-//                Endpoint endpoint = (Endpoint)endpointIterator.next();
-//                Long failedTime = (Long)failedEndpoints.get(endpoint);
-//                if(System.currentTimeMillis() - failedTime.longValue() >= abandonTime) {
-//                    failoverManager.activateEndpoint(endpoint);
-//                }
-//            }
-
             Iterator endpointIterator = failoverManager.getEndpoints().iterator();
             while(endpointIterator.hasNext()) {
                 EndpointWrapper endpointWrapper = (EndpointWrapper)endpointIterator.next();

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/failover/ListBasedFailoverManager.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/failover/ListBasedFailoverManager.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/failover/ListBasedFailoverManager.java	Fri Dec 15 00:04:59 2006
@@ -18,28 +18,22 @@
 
 import org.wso2.esb.mediators.send.FailoverManager;
 import org.wso2.esb.mediators.send.EndpointWrapper;
-import org.wso2.esb.mediators.send.list.failover.FailoverRefresher;
-import org.apache.synapse.config.Endpoint;
 import org.apache.synapse.SynapseException;
 import org.apache.synapse.MessageContext;
 
 import java.util.ArrayList;
-import java.util.HashMap;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: 27/10/2006
- * Time: 19:20:14
- * To change this template use File | Settings | File Templates.
+ * Implementation of the FailoverManager. Most probably this will be the only implementation of that
+ * interface. This will return the first active endpoint in the endpoint list. The Sender
+ * implementation that uses this FailoverManager should take care of resending and deactiavteing
+ * failed endpoints.
  */
 public class ListBasedFailoverManager implements FailoverManager {
 
     private ArrayList endpoints = null;
     private long abandonTime = 0;
 
-    private HashMap failedEndpoints = null;
-
     public void setEndpoints(ArrayList endpoints) {
         this.endpoints = endpoints;
     }
@@ -55,7 +49,6 @@
     public void setAbandonTime(long abandonTime) {
         this.abandonTime = abandonTime;
 
-        failedEndpoints = new HashMap();
         new FailoverRefresher(this, abandonTime, 5000).start();
     }
 
@@ -78,16 +71,4 @@
         else
             throw new SynapseException("No active endpoints.");
     }
-
-    public HashMap getFailedEndpoints() {
-        return failedEndpoints;
-    }
-
-    public synchronized void activateEndpoint(Endpoint endpoint) {
-        failedEndpoints.remove(endpoint);
-    }
-
-    public synchronized void deactivateEndpoint(Endpoint endpoint) {
-        failedEndpoints.put(endpoint, new Long(System.currentTimeMillis()));
-    }
 }

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/sessionless/ListBasedLoadbalancer.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/sessionless/ListBasedLoadbalancer.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/sessionless/ListBasedLoadbalancer.java	Fri Dec 15 00:04:59 2006
@@ -19,19 +19,15 @@
 import org.wso2.esb.mediators.send.LoadbalanceManager;
 import org.wso2.esb.mediators.send.EndpointWrapper;
 import org.wso2.esb.mediators.send.LoadbalanceAlgorithm;
-import org.apache.synapse.config.Endpoint;
 import org.apache.synapse.MessageContext;
 import org.apache.synapse.SynapseException;
 
-import java.util.HashMap;
 import java.util.ArrayList;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: 27/10/2006
- * Time: 12:02:29
- * To change this template use File | Settings | File Templates.
+ * This is a simple implemantation of the LoadbalanceManager interface which only supports
+ * sessionless load balancing. It simple gets the next endpoint from its load balance algorithm and
+ * returns it to the Sender.
  */
 public class ListBasedLoadbalancer implements LoadbalanceManager {
 
@@ -39,12 +35,8 @@
     private LoadbalanceAlgorithm algorithm = null;
     private long abandonTime = 0;
 
-    private HashMap failedEndpoints = null;
-    private int currentEPR = 0;
-
     public void setEndpoints(ArrayList endpoints) {
         this.endpoints = endpoints;
-        failedEndpoints = new HashMap();
     }
 
     public ArrayList getEndpoints() {
@@ -68,7 +60,7 @@
 
             attempts++;
             if(attempts == endpoints.size()) {
-                throw new SecurityException("No active endpoints available.");
+                throw new SynapseException("No active endpoints available.");
             }
         }
 
@@ -79,18 +71,6 @@
         // nothing to do in the session less load balancer
     }
 
-    public HashMap getFailedEndpoints() {
-        return failedEndpoints;
-    }
-
-    public synchronized void activateEndpoint(Endpoint endpoint) {
-        failedEndpoints.remove(endpoint);
-    }
-
-    public synchronized void deactivateEndpoint(Endpoint endpoint) {
-        failedEndpoints.put(endpoint, new Long(System.currentTimeMillis()));
-    }
-
     public LoadbalanceAlgorithm getAlgorithm() {
         return algorithm;
     }

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/sessionless/LoadbalanceRefresher.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/sessionless/LoadbalanceRefresher.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/list/sessionless/LoadbalanceRefresher.java	Fri Dec 15 00:04:59 2006
@@ -19,17 +19,15 @@
 import org.wso2.esb.mediators.send.LoadbalanceManager;
 import org.wso2.esb.mediators.send.EndpointWrapper;
 
-import java.util.HashMap;
 import java.util.Iterator;
 
-import org.apache.synapse.config.Endpoint;
-
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: 31/10/2006
- * Time: 20:30:09
- * To change this template use File | Settings | File Templates.
+ * This is used by the LoadbalanceManager to refresh its endpoints. This will periodically iterates
+ * through the endpoint list and activates the deactivated endpoints. The interval between
+ * iterations is specified by the abandonTime parameter supplied for the constructor.
+ *
+ * It does not check the state of the actual endpoint. Therefore, the endpoint may still remain
+ * failed.
  */
 public class LoadbalanceRefresher extends Thread {
 

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/AbstractSender.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/AbstractSender.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/AbstractSender.java	Fri Dec 15 00:04:59 2006
@@ -24,11 +24,8 @@
 import org.apache.commons.logging.LogFactory;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: Nov 18, 2006
- * Time: 5:51:47 PM
- * To change this template use File | Settings | File Templates.
+ * This provides an abstract class to be used by concrete Senders. It has a sendToEndpoint method,
+ * which sends the message to the given endpoint.
  */
 public abstract class AbstractSender implements Sender {
 

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/FailoverSender.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/FailoverSender.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/FailoverSender.java	Fri Dec 15 00:04:59 2006
@@ -22,15 +22,13 @@
 import org.wso2.esb.mediators.send.FailoverManager;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: Nov 18, 2006
- * Time: 5:57:56 PM
- * To change this template use File | Settings | File Templates.
+ * This sender is used for failover (without load balance) sending.
  */
 public class FailoverSender extends AbstractSender {
 
     private FailoverManager failoverManager = null;
+    private int maximumRetries = 1;
+    private long retryInterval = 3000;
 
     public void send(MessageContext synapseMessageContext) {
 
@@ -45,15 +43,32 @@
                 throw new SynapseException("All endpoints are failing.");
             }
 
-            try {
-                sendToEndpoint(synapseMessageContext, endpointWrapper.getEndpoint());
-                success = true;
-
-            } catch(SynapseException se) {
-
-                // Todo: check if the the exception is due to connection refused
-
-                endpointWrapper.setActive(false);
+            // now we have an endpoint. try send to it with retrying.
+            int retries = 0;
+            while(retries <= maximumRetries && !success) {
+                try {
+                    sendToEndpoint(synapseMessageContext, endpointWrapper.getEndpoint());
+                    success = true;
+
+                } catch(SynapseException se) {
+
+                    // Todo: check if the the exception is due to connection refused
+
+                    if(retries == maximumRetries) {
+                        endpointWrapper.setActive(false);
+                        retries++;
+
+                    } else if(retries <= maximumRetries) {
+
+                        retries++;
+
+                        try {
+                            Thread.sleep(retryInterval);
+                        } catch (InterruptedException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }
             }
         }
     }
@@ -65,4 +80,20 @@
     public FailoverManager getFailoverManager() {
         return failoverManager;
     }
+
+    public int getMaximumRetries() {
+        return maximumRetries;
+    }
+
+    public void setMaximumRetries(int maximumRetries) {
+        this.maximumRetries = maximumRetries;
+    }
+
+    public long getRetryInterval() {
+        return retryInterval;
+    }
+
+    public void setRetryInterval(long retryInterval) {
+        this.retryInterval = retryInterval;
+    }
 }

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/LoadbalanceSender.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/LoadbalanceSender.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/LoadbalanceSender.java	Fri Dec 15 00:04:59 2006
@@ -17,30 +17,72 @@
 package org.wso2.esb.mediators.send.senders;
 
 import org.apache.synapse.MessageContext;
+import org.apache.synapse.SynapseException;
 import org.wso2.esb.mediators.send.EndpointWrapper;
 import org.wso2.esb.mediators.send.LoadbalanceManager;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: Nov 18, 2006
- * Time: 6:01:10 PM
- * To change this template use File | Settings | File Templates.
+ * This sender is used for load balance without failover.
  */
 public class LoadbalanceSender extends AbstractSender {
 
     private LoadbalanceManager loadbalanceManager = null;
+    private int maximumRetries = 1;
+    private long retryInterval = 30000;
 
     public void send(MessageContext synapseMessageContext) {
         EndpointWrapper endpointWrapper = loadbalanceManager.getEndpoint(synapseMessageContext);
-        sendToEndpoint(synapseMessageContext, endpointWrapper.getEndpoint());
+
+        // now we have an endpoint. try send to it with retrying.
+        boolean success = false;
+        int retries = 0;
+        while(retries <= maximumRetries && !success) {
+            try {
+                sendToEndpoint(synapseMessageContext, endpointWrapper.getEndpoint());
+
+            } catch(SynapseException se) {
+
+                // Todo: check if the the exception is due to connection refused
+
+                if(retries == maximumRetries) {
+                    endpointWrapper.setActive(false);
+                    retries++;
+
+                } else if(retries <= maximumRetries) {
+
+                    retries++;
+
+                    try {
+                        Thread.sleep(retryInterval);
+                    } catch (InterruptedException e) {
+                        e.printStackTrace();
+                    }
+                }
+            }
+        }
     }
 
-     public void setLoadbalanceManager(LoadbalanceManager loadbalanceManager) {
+    public void setLoadbalanceManager(LoadbalanceManager loadbalanceManager) {
         this.loadbalanceManager = loadbalanceManager;
     }
 
     public LoadbalanceManager getLoadbalanceManager() {
         return loadbalanceManager;
     }
+
+    public int getMaximumRetries() {
+        return maximumRetries;
+    }
+
+    public void setMaximumRetries(int maximumRetries) {
+        this.maximumRetries = maximumRetries;
+    }
+
+    public long getRetryInterval() {
+        return retryInterval;
+    }
+
+    public void setRetryInterval(long retryInterval) {
+        this.retryInterval = retryInterval;
+    }
 }

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/LoadbalanceWithFailoverSender.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/LoadbalanceWithFailoverSender.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/LoadbalanceWithFailoverSender.java	Fri Dec 15 00:04:59 2006
@@ -22,15 +22,13 @@
 import org.wso2.esb.mediators.send.EndpointWrapper;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: Nov 18, 2006
- * Time: 6:03:21 PM
- * To change this template use File | Settings | File Templates.
+ * This sender is used for load balance with failover sending.
  */
 public class LoadbalanceWithFailoverSender extends AbstractSender {
 
     private LoadbalanceManager loadbalanceManager = null;
+    private int maximumRetries = 1;
+    private long retryInterval = 30000;
 
     public void send(MessageContext synapseMessageContext) {
         boolean success = false;
@@ -44,24 +42,57 @@
                 throw new SynapseException("No active end points.");
             }
 
-            try {
-                sendToEndpoint(synapseMessageContext, endpointWrapper.getEndpoint());
-                success = true;
-
-            } catch(SynapseException se) {
-
-                // Todo: check if the the exception is due to connection refused
-
-                endpointWrapper.setActive(false);
+            // now we have an endpoint. try send to it with retrying.
+            int retries = 0;
+            while(retries <= maximumRetries && !success) {
+                try {
+                    sendToEndpoint(synapseMessageContext, endpointWrapper.getEndpoint());
+                    success = true;
+
+                } catch(SynapseException se) {
+
+                    // Todo: check if the the exception is due to connection refused
+
+                    if(retries == maximumRetries) {
+                        endpointWrapper.setActive(false);
+                        retries++;
+
+                    } else if(retries <= maximumRetries) {
+
+                        retries++;
+
+                        try {
+                            Thread.sleep(retryInterval);
+                        } catch (InterruptedException e) {
+                            e.printStackTrace();
+                        }
+                    }
+                }
             }
         }
     }
 
+    public LoadbalanceManager getLoadbalanceManager() {
+        return loadbalanceManager;
+    }
+
     public void setLoadbalanceManager(LoadbalanceManager loadbalanceManager) {
         this.loadbalanceManager = loadbalanceManager;
     }
 
-    public LoadbalanceManager getLoadbalanceManager() {
-        return loadbalanceManager;
+    public int getMaximumRetries() {
+        return maximumRetries;
+    }
+
+    public void setMaximumRetries(int maximumRetries) {
+        this.maximumRetries = maximumRetries;
+    }
+
+    public long getRetryInterval() {
+        return retryInterval;
+    }
+
+    public void setRetryInterval(long retryInterval) {
+        this.retryInterval = retryInterval;
     }
 }

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/Sender.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/Sender.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/Sender.java	Fri Dec 15 00:04:59 2006
@@ -19,13 +19,15 @@
 import org.apache.synapse.MessageContext;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: Nov 18, 2006
- * Time: 5:49:33 PM
- * To change this template use File | Settings | File Templates.
+ * All senders implementing various sending patterns must implement this interface. Current sending
+ * patterns are simple, failover, load balance and load balance with fail over.
  */
 public interface Sender {
 
+    /**
+     * This method is invoked to send the message to the destination.
+     *
+     * @param synapseMessageContext SynapseMassageContext for current message
+     */
     public void send(MessageContext synapseMessageContext);
 }

Modified: esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/SimpleSender.java
==============================================================================
--- esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/SimpleSender.java	(original)
+++ esb/java/trunk/modules/core/src/main/java/org/wso2/esb/mediators/send/senders/SimpleSender.java	Fri Dec 15 00:04:59 2006
@@ -20,11 +20,7 @@
 import org.apache.synapse.config.Endpoint;
 
 /**
- * Created by IntelliJ IDEA.
- * User: chathura
- * Date: Nov 18, 2006
- * Time: 5:49:18 PM
- * To change this template use File | Settings | File Templates.
+ * This sender is used for sending the message to a single endpoint.
  */
 public class SimpleSender extends AbstractSender {
 




More information about the Esb-java-dev mailing list