You are viewing a plain text version of this content. The canonical link for it is here.
Posted to axis-cvs@ws.apache.org by az...@apache.org on 2007/06/14 10:52:14 UTC

svn commit: r547179 - in /webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2: clustering/context/ContextManager.java clustering/context/Replicator.java context/AbstractContext.java

Author: azeez
Date: Thu Jun 14 01:52:13 2007
New Revision: 547179

URL: http://svn.apache.org/viewvc?view=rev&rev=547179
Log:
Properly implementing AbstractContext.flush()


Modified:
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/context/ContextManager.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/context/Replicator.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/context/AbstractContext.java

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/context/ContextManager.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/context/ContextManager.java?view=diff&rev=547179&r1=547178&r2=547179
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/context/ContextManager.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/context/ContextManager.java Thu Jun 14 01:52:13 2007
@@ -51,9 +51,8 @@
     /**
      * @param context
      * @return True - if the provided {@link AbstractContext}  is clusterable
-     * @throws ClusteringFault
      */
-    boolean isContextClusterable(AbstractContext context) throws ClusteringFault;
+    boolean isContextClusterable(AbstractContext context);
 
     /**
      * Indicates whether a particular message has been ACKed by all members of a cluster

Modified: 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=diff&rev=547179&r1=547178&r2=547179
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/context/Replicator.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/context/Replicator.java Thu Jun 14 01:52:13 2007
@@ -18,7 +18,11 @@
 
 import org.apache.axis2.clustering.ClusterManager;
 import org.apache.axis2.clustering.ClusteringFault;
-import org.apache.axis2.context.*;
+import org.apache.axis2.context.AbstractContext;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.context.ServiceContext;
+import org.apache.axis2.context.ServiceGroupContext;
 import org.apache.axis2.description.AxisOperation;
 import org.apache.axis2.engine.AxisConfiguration;
 import org.apache.commons.logging.Log;
@@ -32,30 +36,69 @@
     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) {
+        if (!doReplication(msgContext)) {
             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);
+        }
+    }
 
-        AxisOperation axisOperation = msgContext.getAxisOperation();
-        if (axisOperation == null) {
+    public static void replicate(AbstractContext abstractContext) throws ClusteringFault {
+        if (!doReplication(abstractContext)) {
             return;
         }
         log.debug("Going to replicate state...");
         try {
-            replicateState(msgContext);
+            replicateState(abstractContext);
         } catch (Exception e) {
             String message = "Could not replicate the state";
             throw new ClusteringFault(message, e);
         }
     }
 
+    /**
+     * Do replication only if context replication is enabled.
+     * Also note that if there are no members, we need not do any replication
+     *
+     * @param abstractContext
+     * @return true - State needs to be replicated
+     *         false - otherwise
+     */
+    private static boolean doReplication(AbstractContext abstractContext) {
+        ClusterManager clusterManager =
+                abstractContext.getRootContext().getAxisConfiguration().getClusterManager();
+        return clusterManager != null &&
+               clusterManager.getContextManager() != null &&
+               clusterManager.getContextManager().isContextClusterable(abstractContext) &&
+               clusterManager.getMemberCount() != 0;
+    }
+
+    private static void replicateState(AbstractContext abstractContext) throws ClusteringFault {
+        ClusterManager clusterManager =
+                abstractContext.getRootContext().getAxisConfiguration().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);
+            }
+            if (!abstractContext.getPropertyDifferences().isEmpty()) {
+                String msgUUID = contextManager.updateContext(abstractContext);
+                waitForACKs(contextManager, msgUUID);
+            }
+        } else {
+            String msg = "Cannot replicate contexts since " +
+                         "ClusterManager is not specified in the axis2.xml file.";
+            throw new ClusteringFault(msg);
+        }
+    }
+
     private static void replicateState(MessageContext msgContext) throws ClusteringFault {
         ConfigurationContext configurationContext = msgContext.getConfigurationContext();
         AxisConfiguration axisConfiguration = configurationContext.getAxisConfiguration();
@@ -94,23 +137,7 @@
                 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));
+                waitForACKs(contextManager, msgUUID);
             }
 
         } else {
@@ -118,5 +145,25 @@
                          "ClusterManager is not specified in the axis2.xml file.";
             throw new ClusteringFault(msg);
         }
+    }
+
+    private static void waitForACKs(ContextManager contextManager,
+                                    String msgUUID) throws ClusteringFault {
+        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));
     }
 }

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/context/AbstractContext.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/context/AbstractContext.java?view=diff&rev=547179&r1=547178&r2=547179
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/context/AbstractContext.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/context/AbstractContext.java Thu Jun 14 01:52:13 2007
@@ -19,9 +19,7 @@
 
 import org.apache.axis2.AxisFault;
 import org.apache.axis2.clustering.ClusterManager;
-import org.apache.axis2.clustering.context.ContextManager;
-import org.apache.axis2.engine.AxisConfiguration;
-import org.apache.axis2.i18n.Messages;
+import org.apache.axis2.clustering.context.Replicator;
 
 import java.util.Collections;
 import java.util.HashMap;
@@ -274,24 +272,7 @@
     }
 
     public void flush() throws AxisFault {
-
-        ConfigurationContext configContext = getRootContext();
-        if (configContext == null) {
-            throw new AxisFault(Messages.getMessage("cannotFlushRootNull"));
-        }
-
-        AxisConfiguration axisConfiguration = configContext.getAxisConfiguration();
-        ClusterManager clusterManager = axisConfiguration.getClusterManager();
-
-        //Calling the ClusterManager probably to replicate the updated state of the context.
-        if (clusterManager != null) {
-            ContextManager contextManager = clusterManager.getContextManager();
-            if (contextManager != null && contextManager.isContextClusterable(this)) {
-                contextManager.updateContext(this);
-            }
-        }
-
-        //Other logic needed for flushing the contexts
+        Replicator.replicate(this);
     }
 
     public abstract ConfigurationContext getRootContext();



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