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 [EMAIL PROTECTED] 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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]