You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@synapse.apache.org by hi...@apache.org on 2010/11/17 21:35:39 UTC
svn commit: r1036208 - in
/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse:
config/xml/endpoints/FailoverEndpointFactory.java
config/xml/endpoints/FailoverEndpointSerializer.java
endpoints/FailoverEndpoint.java
Author: hiranya
Date: Wed Nov 17 20:35:39 2010
New Revision: 1036208
URL: http://svn.apache.org/viewvc?rev=1036208&view=rev
Log:
Fixing SYNAPSE-709 (failover endpoint bug fix)
Modified:
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/FailoverEndpointFactory.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/FailoverEndpointSerializer.java
synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/FailoverEndpoint.java
Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/FailoverEndpointFactory.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/FailoverEndpointFactory.java?rev=1036208&r1=1036207&r2=1036208&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/FailoverEndpointFactory.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/FailoverEndpointFactory.java Wed Nov 17 20:35:39 2010
@@ -24,6 +24,7 @@ import org.apache.synapse.SynapseConstan
import org.apache.synapse.SynapseException;
import org.apache.synapse.endpoints.Endpoint;
import org.apache.synapse.endpoints.FailoverEndpoint;
+import org.apache.axis2.util.JavaUtils;
import javax.xml.namespace.QName;
import java.util.List;
@@ -73,8 +74,13 @@ public class FailoverEndpointFactory ext
}
// set endpoints and return
- failoverEndpoint.setChildren(getEndpoints(
- failoverElement, failoverEndpoint, properties));
+ failoverEndpoint.setChildren(getEndpoints(failoverElement, failoverEndpoint, properties));
+
+ String dynamicFO = failoverElement.getAttributeValue(new QName("dynamic"));
+ if (dynamicFO != null && JavaUtils.isFalseExplicitly(dynamicFO)) {
+ failoverEndpoint.setDynamic(false);
+ }
+
// process the parameters
processProperties(failoverEndpoint, epConfig);
Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/FailoverEndpointSerializer.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/FailoverEndpointSerializer.java?rev=1036208&r1=1036207&r2=1036208&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/FailoverEndpointSerializer.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/config/xml/endpoints/FailoverEndpointSerializer.java Wed Nov 17 20:35:39 2010
@@ -53,11 +53,14 @@ public class FailoverEndpointSerializer
serializeCommonAttributes(endpoint,endpointElement);
-
for (Endpoint childEndpoint : failoverEndpoint.getChildren()) {
failoverElement.addChild(EndpointSerializer.getElementFromEndpoint(childEndpoint));
}
+ if (!failoverEndpoint.isDynamic()) {
+ failoverElement.addAttribute("dynamic", "false", null);
+ }
+
return endpointElement;
}
}
Modified: synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/FailoverEndpoint.java
URL: http://svn.apache.org/viewvc/synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/FailoverEndpoint.java?rev=1036208&r1=1036207&r2=1036208&view=diff
==============================================================================
--- synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/FailoverEndpoint.java (original)
+++ synapse/trunk/java/modules/core/src/main/java/org/apache/synapse/endpoints/FailoverEndpoint.java Wed Nov 17 20:35:39 2010
@@ -36,6 +36,9 @@ public class FailoverEndpoint extends Ab
/** Endpoint for which is currently used */
private Endpoint currentEndpoint = null;
+ /** The fail-over mode supported by this endpoint. By default we do dynamic fail-over */
+ private boolean dynamic = true;
+
public void send(MessageContext synCtx) {
if (log.isDebugEnabled()) {
@@ -59,28 +62,20 @@ public class FailoverEndpoint extends Ab
return;
}
- if (currentEndpoint == null) {
- currentEndpoint = getChildren().get(0);
- }
-
- if (currentEndpoint.readyToSend()) {
- if (isARetry && metricsMBean != null) {
- metricsMBean.reportSendingFault(SynapseConstants.ENDPOINT_FO_FAIL_OVER);
- }
- synCtx.pushFaultHandler(this);
- currentEndpoint.send(synCtx);
+ if (dynamic) {
+ // Dynamic fail-over mode - Switch to a backup endpoint when an error occurs
+ // in the primary endpoint. But switch back to the primary as soon as it becomes
+ // active again.
- } else {
boolean foundEndpoint = false;
for (Endpoint endpoint : getChildren()) {
if (endpoint.readyToSend()) {
foundEndpoint = true;
- currentEndpoint = endpoint;
if (isARetry && metricsMBean != null) {
metricsMBean.reportSendingFault(SynapseConstants.ENDPOINT_FO_FAIL_OVER);
}
synCtx.pushFaultHandler(this);
- currentEndpoint.send(synCtx);
+ endpoint.send(synCtx);
break;
}
}
@@ -92,6 +87,46 @@ public class FailoverEndpoint extends Ab
log.warn(msg);
informFailure(synCtx, SynapseConstants.ENDPOINT_FO_NONE_READY, msg);
}
+
+ } else {
+ // Static fail-over mode - Switch to a backup endpoint when an error occurs
+ // in the primary endpoint. Keep sending messages to the backup endpoint until
+ // an error occurs in that endpoint.
+
+ if (currentEndpoint == null) {
+ currentEndpoint = getChildren().get(0);
+ }
+
+ if (currentEndpoint.readyToSend()) {
+ if (isARetry && metricsMBean != null) {
+ metricsMBean.reportSendingFault(SynapseConstants.ENDPOINT_FO_FAIL_OVER);
+ }
+ synCtx.pushFaultHandler(this);
+ currentEndpoint.send(synCtx);
+
+ } else {
+ boolean foundEndpoint = false;
+ for (Endpoint endpoint : getChildren()) {
+ if (endpoint.readyToSend()) {
+ foundEndpoint = true;
+ currentEndpoint = endpoint;
+ if (isARetry && metricsMBean != null) {
+ metricsMBean.reportSendingFault(SynapseConstants.ENDPOINT_FO_FAIL_OVER);
+ }
+ synCtx.pushFaultHandler(this);
+ currentEndpoint.send(synCtx);
+ break;
+ }
+ }
+
+ if (!foundEndpoint) {
+ String msg = "Failover endpoint : " +
+ (getName() != null ? getName() : SynapseConstants.ANONYMOUS_ENDPOINT) +
+ " - no ready child endpoints";
+ log.warn(msg);
+ informFailure(synCtx, SynapseConstants.ENDPOINT_FO_NONE_READY, msg);
+ }
+ }
}
}
@@ -122,5 +157,13 @@ public class FailoverEndpoint extends Ab
}
}
return false;
- }
+ }
+
+ public boolean isDynamic() {
+ return dynamic;
+ }
+
+ public void setDynamic(boolean dynamic) {
+ this.dynamic = dynamic;
+ }
}