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/07/08 16:23:05 UTC

svn commit: r554372 - in /webservices/axis2/trunk/java/modules: clustering/src/org/apache/axis2/clustering/tribes/ kernel/src/org/apache/axis2/clustering/

Author: azeez
Date: Sun Jul  8 07:23:04 2007
New Revision: 554372

URL: http://svn.apache.org/viewvc?view=rev&rev=554372
Log:
Before Axis2 clustering functionality initializes, the state should be 
obtained from a neighbour. Till then, Axis2 should block all reuqests. 
The RequestBlockingHandler will facilitate this.


Added:
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/RequestBlockingHandler.java
Modified:
    webservices/axis2/trunk/java/modules/clustering/src/org/apache/axis2/clustering/tribes/TribesClusterManager.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/ClusterManager.java
    webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/ClusteringConstants.java

Modified: webservices/axis2/trunk/java/modules/clustering/src/org/apache/axis2/clustering/tribes/TribesClusterManager.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/clustering/src/org/apache/axis2/clustering/tribes/TribesClusterManager.java?view=diff&rev=554372&r1=554371&r2=554372
==============================================================================
--- webservices/axis2/trunk/java/modules/clustering/src/org/apache/axis2/clustering/tribes/TribesClusterManager.java (original)
+++ webservices/axis2/trunk/java/modules/clustering/src/org/apache/axis2/clustering/tribes/TribesClusterManager.java Sun Jul  8 07:23:04 2007
@@ -21,9 +21,14 @@
 
 import org.apache.axiom.om.OMElement;
 import org.apache.axis2.AxisFault;
+import org.apache.axis2.engine.Phase;
+import org.apache.axis2.engine.DispatchPhase;
+import org.apache.axis2.engine.AxisConfiguration;
+import org.apache.axis2.engine.Handler;
 import org.apache.axis2.clustering.ClusterManager;
 import org.apache.axis2.clustering.ClusteringConstants;
 import org.apache.axis2.clustering.ClusteringFault;
+import org.apache.axis2.clustering.RequestBlockingHandler;
 import org.apache.axis2.clustering.configuration.ConfigurationManager;
 import org.apache.axis2.clustering.configuration.DefaultConfigurationManager;
 import org.apache.axis2.clustering.context.ContextManager;
@@ -32,6 +37,8 @@
 import org.apache.axis2.clustering.control.GetStateCommand;
 import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.description.Parameter;
+import org.apache.axis2.description.PhaseRule;
+import org.apache.axis2.description.HandlerDescription;
 import org.apache.catalina.tribes.Channel;
 import org.apache.catalina.tribes.ChannelException;
 import org.apache.catalina.tribes.ManagedChannel;
@@ -69,6 +76,43 @@
     }
 
     public void init() throws ClusteringFault {
+
+        // Until the clustering stuff is properly initialized, we have to block.
+        configurationContext.setProperty(ClusteringConstants.BLOCK_ALL_REQUESTS, "true");
+        AxisConfiguration axisConfig = configurationContext.getAxisConfiguration();
+        for (Iterator iterator = axisConfig.getInFlowPhases().iterator();
+             iterator.hasNext();) {
+            Phase phase = (Phase) iterator.next();
+            if (phase instanceof DispatchPhase) {
+                PhaseRule rule = new PhaseRule("Dispatch");
+                rule.setAfter("SOAPMessageBodyBasedDispatcher");
+                rule.setBefore("InstanceDispatcher");
+                RequestBlockingHandler requestBlockingHandler = new RequestBlockingHandler();
+                HandlerDescription handlerDesc = requestBlockingHandler.getHandlerDesc();
+                handlerDesc.setHandler(requestBlockingHandler);
+                handlerDesc.setName("RequestBlockingHandler");
+                handlerDesc.setRules(rule);
+                phase.addHandler(requestBlockingHandler);
+                break;
+            }
+        }
+        for (Iterator iterator = axisConfig.getInFaultFlowPhases().iterator();
+             iterator.hasNext();) {
+            Phase phase = (Phase) iterator.next();
+            if (phase instanceof DispatchPhase) {
+                PhaseRule rule = new PhaseRule("Dispatch");
+                rule.setAfter("SOAPMessageBodyBasedDispatcher");
+                rule.setBefore("InstanceDispatcher");
+                RequestBlockingHandler requestBlockingHandler = new RequestBlockingHandler();
+                HandlerDescription handlerDesc = requestBlockingHandler.getHandlerDesc();
+                handlerDesc.setHandler(requestBlockingHandler);
+                handlerDesc.setName("RequestBlockingHandler");
+                handlerDesc.setRules(rule);
+                phase.addHandler(requestBlockingHandler);
+                break;
+            }
+        }
+
         ChannelSender sender = new ChannelSender();
 
         channelListener = new ChannelListener(configurationContext,
@@ -169,7 +213,7 @@
                         log.error(e);
                         break;
                     }
-                    numberOfTries ++;
+                    numberOfTries++;
                 }
                 configurationContext.
                         setNonReplicableProperty(ClusteringConstants.CLUSTER_INITIALIZED,
@@ -181,6 +225,7 @@
             String message = "Error starting Tribes channel";
             throw new ClusteringFault(message, e);
         }
+        configurationContext.removeProperty(ClusteringConstants.BLOCK_ALL_REQUESTS);
     }
 
     public void setConfigurationManager(ConfigurationManager configurationManager) {

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/ClusterManager.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/ClusterManager.java?view=diff&rev=554372&r1=554371&r2=554372
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/ClusterManager.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/ClusterManager.java Sun Jul  8 07:23:04 2007
@@ -23,7 +23,13 @@
 import org.apache.axis2.clustering.context.ContextManager;
 import org.apache.axis2.description.ParameterInclude;
 import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.engine.Handler;
 
+/**
+ * This is the main interface in the Axis2 clustering implementation.
+ * In order to plug-in a new clustering implementation, this interface has to be
+ * implmented.
+ */
 public interface ClusterManager extends ParameterInclude {
 
     /**
@@ -31,37 +37,32 @@
      *
      * @throws ClusteringFault
      */
-    public void init() throws ClusteringFault;
+    void init() throws ClusteringFault;
 
     /**
-     *
      * @return The ContextManager
      */
-    public ContextManager getContextManager ();
+    ContextManager getContextManager();
 
     /**
-     *
      * @return The ConfigurationManager
      */
-    public ConfigurationManager getConfigurationManager ();
+    ConfigurationManager getConfigurationManager();
 
     /**
-     *
      * @param contextManager
      */
-    public void setContextManager (ContextManager contextManager);
+    void setContextManager(ContextManager contextManager);
 
     /**
-     *
      * @param configurationManager
      */
-    public void setConfigurationManager (ConfigurationManager configurationManager);
+    void setConfigurationManager(ConfigurationManager configurationManager);
 
     /**
-     *
      * @throws ClusteringFault
      */
-    public void shutdown () throws ClusteringFault;
+    void shutdown() throws ClusteringFault;
 
     /**
      * Set the configuration context

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/ClusteringConstants.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/ClusteringConstants.java?view=diff&rev=554372&r1=554371&r2=554372
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/ClusteringConstants.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/ClusteringConstants.java Sun Jul  8 07:23:04 2007
@@ -27,6 +27,8 @@
 
     public static final String AVOID_INITIATION_KEY = "AvoidInitiation";
     public static final String DOMAIN = "domain";
+    public static final String NODE_MANAGER_SERVICE = "Axis2NodeManager";
     public static final String CLUSTER_INITIALIZED = "local_cluster.initialized";
     public static final String TIME_TO_SEND = "local_cluster.time.to.send";
+    public static final String BLOCK_ALL_REQUESTS = "local_wso2wsas.block.requests";
 }

Added: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/RequestBlockingHandler.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/RequestBlockingHandler.java?view=auto&rev=554372
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/RequestBlockingHandler.java (added)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/RequestBlockingHandler.java Sun Jul  8 07:23:04 2007
@@ -0,0 +1,81 @@
+/*                                                                             
+ * 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;
+
+import org.apache.axis2.handlers.AbstractHandler;
+import org.apache.axis2.context.MessageContext;
+import org.apache.axis2.context.ConfigurationContext;
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.description.AxisServiceGroup;
+import org.apache.axis2.description.Parameter;
+import org.apache.axis2.description.AxisService;
+
+/**
+ *
+ */
+public class RequestBlockingHandler extends AbstractHandler {
+    public InvocationResponse invoke(MessageContext msgContext) throws AxisFault {
+
+        // Handle blocking at gobal level
+        ConfigurationContext cfgCtx = msgContext.getConfigurationContext();
+        Boolean isBlockingAllRequests =
+                (Boolean) cfgCtx.getProperty(ClusteringConstants.BLOCK_ALL_REQUESTS);
+        AxisServiceGroup serviceGroup = msgContext.getAxisServiceGroup();
+
+        // Handle blocking at service group level
+        Boolean isBlockingServiceGroupRequests = Boolean.FALSE;
+        if (serviceGroup != null) {
+            Parameter blockingParam =
+                    serviceGroup.getParameter(ClusteringConstants.BLOCK_ALL_REQUESTS);
+            if (blockingParam != null) {
+                isBlockingServiceGroupRequests = (Boolean) blockingParam.getValue();
+            }
+        }
+
+        // Handle blocking at service level
+        AxisService service = msgContext.getAxisService();
+        Boolean isBlockingServiceRequests = Boolean.FALSE;
+        if (service != null) {
+            Parameter blockingParam =
+                    service.getParameter(ClusteringConstants.BLOCK_ALL_REQUESTS);
+            if (blockingParam != null) {
+                isBlockingServiceRequests = (Boolean) blockingParam.getValue();
+            }
+        }
+
+        if (isBlockingAllRequests != null && isBlockingAllRequests.booleanValue()) {
+
+            // Allow only NodeManager service commit requests to pass through. Block all others
+            AxisService axisService = msgContext.getAxisService();
+            if (!axisService.getName().equals(ClusteringConstants.NODE_MANAGER_SERVICE)) {
+                if (!msgContext.getAxisOperation().getName().equals("commit")) {
+                    throw new AxisFault("System is being reinitialized. " +
+                                        "Please try again in a few seconds.");
+                } else {
+                    throw new AxisFault("NodeManager service cannot call any other " +
+                                        "operation after calling prepare");
+                }
+            }
+        } else if (isBlockingServiceGroupRequests.booleanValue()) {
+            throw new AxisFault("This service group is being initialized or unloaded. " +
+                                "Please try again in a few seconds.");
+        } else if (isBlockingServiceRequests.booleanValue()) {
+            throw new AxisFault("This service is being initialized. " +
+                                "Please try again in a few seconds.");
+        }
+        return InvocationResponse.CONTINUE;
+    }
+}



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