You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-dev@axis.apache.org by az...@apache.org on 2007/06/13 18:36:08 UTC

svn commit: r546951 - in /webservices/axis2/trunk/java/modules: clustering/src/org/apache/axis2/clustering/handlers/ kernel/src/org/apache/axis2/clustering/context/ kernel/src/org/apache/axis2/receivers/

Author: azeez
Date: Wed Jun 13 09:36:02 2007
New Revision: 546951

URL: http://svn.apache.org/viewvc?view=rev&rev=546951
Log:
Removing the Replicationhandler and invoking the replication logic at the MR level after the business logic is invoked.


Added:
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/context/Replicator.java
Removed:
    webservices/axis2/trunk/java/modules/clustering/src/org/apache/axis2/clustering/handlers/ReplicationHandler.java
Modified:
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInMessageReceiver.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInOutSyncMessageReceiver.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractMessageReceiver.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractRobustInMessageReceiver.java

Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/context/Replicator.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/context/Replicator.java?view=auto&rev=546951
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/context/Replicator.java (added)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/context/Replicator.java Wed Jun 13 09:36:02 2007
@@ -0,0 +1,122 @@
+/*
+ * Copyright 2004,2005 The Apache Software Foundation.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package org.apache.axis2.clustering.context;
+
+import org.apache.axis2.clustering.ClusterManager;
+import org.apache.axis2.clustering.ClusteringFault;
+import org.apache.axis2.context.*;
+import org.apache.axis2.description.AxisOperation;
+import org.apache.axis2.engine.AxisConfiguration;
+import org.apache.commons.logging.Log;
+import org.apache.commons.logging.LogFactory;
+
+import java.util.ArrayList;
+import java.util.List;
+
+public final class Replicator {
+
+    private static final Log log = LogFactory.getLog(Replicator.class);
+
+    public static void replicate(MessageContext msgContext) throws ClusteringFault {
+
+        // Do replication only if context replication is enabled.
+        // Also note that if there are no members, we need not do any replication
+        ClusterManager clusterManager =
+                msgContext.getConfigurationContext().getAxisConfiguration().getClusterManager();
+        if (clusterManager == null ||
+            clusterManager.getContextManager() == null ||
+            clusterManager.getMemberCount() == 0) {
+            return;
+        }
+
+        AxisOperation axisOperation = msgContext.getAxisOperation();
+        if (axisOperation == null) {
+            return;
+        }
+        log.debug("Going to replicate state...");
+        try {
+            replicateState(msgContext);
+        } catch (Exception e) {
+            String message = "Could not replicate the state";
+            throw new ClusteringFault(message, e);
+        }
+    }
+
+    private static void replicateState(MessageContext msgContext) throws ClusteringFault {
+        ConfigurationContext configurationContext = msgContext.getConfigurationContext();
+        AxisConfiguration axisConfiguration = configurationContext.getAxisConfiguration();
+        ClusterManager clusterManager = axisConfiguration.getClusterManager();
+
+        if (clusterManager != null) {
+
+            ContextManager contextManager = clusterManager.getContextManager();
+            if (contextManager == null) {
+                String msg = "Cannot replicate contexts since " +
+                             "ContextManager is not specified in the axis2.xml file.";
+                throw new ClusteringFault(msg);
+            }
+
+            List contexts = new ArrayList();
+
+            // Do we need to replicate state stored in ConfigurationContext?
+            if (!configurationContext.getPropertyDifferences().isEmpty()) {
+                contexts.add(configurationContext);
+            }
+
+            // Do we need to replicate state stored in ServiceGroupContext?
+            ServiceGroupContext sgContext = msgContext.getServiceGroupContext();
+            if (sgContext != null && !sgContext.getPropertyDifferences().isEmpty()) {
+                contexts.add(sgContext);
+            }
+
+            // Do we need to replicate state stored in ServiceContext?
+            ServiceContext serviceContext = msgContext.getServiceContext();
+            if (serviceContext != null && !serviceContext.getPropertyDifferences().isEmpty()) {
+                contexts.add(serviceContext);
+            }
+
+            // Do the actual replication here
+            if (!contexts.isEmpty()) {
+                String msgUUID =
+                        contextManager.updateContexts((AbstractContext[]) contexts.
+                                toArray(new AbstractContext[contexts.size()]));
+
+                long start = System.currentTimeMillis();
+
+                // Wait till all members have ACKed receipt & successful processing of
+                // the message with UUID 'msgUUID'
+                do {
+
+                    // Wait sometime before checking whether message is ACKed
+                    try {
+                        Thread.sleep(50);
+                    } catch (InterruptedException ignored) {
+                    }
+                    if (System.currentTimeMillis() - start > 40000) {
+                        throw new ClusteringFault("ACKs not received from all members within 40 sec. " +
+                                                  "Aborting wait.");
+                    }
+                } while (!contextManager.isMessageAcknowledged(msgUUID));
+            }
+
+        } else {
+            String msg = "Cannot replicate contexts since " +
+                         "ClusterManager is not specified in the axis2.xml file.";
+            throw new ClusteringFault(msg);
+        }
+    }
+}

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInMessageReceiver.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInMessageReceiver.java?view=diff&rev=546951&r1=546950&r2=546951
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInMessageReceiver.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInMessageReceiver.java Wed Jun 13 09:36:02 2007
@@ -31,6 +31,7 @@
         ThreadContextDescriptor tc = setThreadContext(messageCtx);
         try {
             invokeBusinessLogic(messageCtx);
+            replicateState(messageCtx);
         } finally {
             restoreThreadContext(tc);
         }

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInOutSyncMessageReceiver.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInOutSyncMessageReceiver.java?view=diff&rev=546951&r1=546950&r2=546951
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInOutSyncMessageReceiver.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractInOutSyncMessageReceiver.java Wed Jun 13 09:36:02 2007
@@ -37,14 +37,10 @@
         ThreadContextDescriptor tc = setThreadContext(msgContext);
         try {
             invokeBusinessLogic(msgContext, outMsgContext);
+            replicateState(msgContext);
         } finally {
             restoreThreadContext(tc);
         }
-
-        AxisEngine engine =
-                new AxisEngine(
-                        msgContext.getConfigurationContext());
-
-        engine.send(outMsgContext);
+        AxisEngine.send(outMsgContext);
     }
 }

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractMessageReceiver.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractMessageReceiver.java?view=diff&rev=546951&r1=546950&r2=546951
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractMessageReceiver.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractMessageReceiver.java Wed Jun 13 09:36:02 2007
@@ -23,6 +23,8 @@
 import org.apache.axiom.soap.SOAPFactory;
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.Constants;
+import org.apache.axis2.clustering.context.Replicator;
+import org.apache.axis2.clustering.ClusteringFault;
 import org.apache.axis2.context.MessageContext;
 import org.apache.axis2.context.ServiceContext;
 import org.apache.axis2.description.AxisService;
@@ -47,6 +49,10 @@
     public class ThreadContextDescriptor {
         public ClassLoader oldClassLoader;
         public MessageContext oldMessageContext;
+    }
+
+    public void replicateState(MessageContext messageContext) throws ClusteringFault {
+        Replicator.replicate(messageContext);
     }
 
     /**

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractRobustInMessageReceiver.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractRobustInMessageReceiver.java?view=diff&rev=546951&r1=546950&r2=546951
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractRobustInMessageReceiver.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/receivers/AbstractRobustInMessageReceiver.java Wed Jun 13 09:36:02 2007
@@ -31,6 +31,7 @@
         ThreadContextDescriptor tc = setThreadContext(messageCtx);
         try {
             invokeBusinessLogic(messageCtx);
+            replicateState(messageCtx);
         } finally {
             restoreThreadContext(tc);
         }



---------------------------------------------------------------------
To unsubscribe, e-mail: axis-cvs-unsubscribe@ws.apache.org
For additional commands, e-mail: axis-cvs-help@ws.apache.org