[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 <failover> 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 <loadbalance> 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