You are viewing a plain text version of this content. The canonical link for it is here.
Posted to java-commits@axis.apache.org by az...@apache.org on 2012/02/14 13:04:35 UTC

svn commit: r1243888 - in /axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes: Axis2ChannelListener.java Axis2GroupChannel.java ClassLoaderUtil.java TribesAxisObserver.java TribesClusteringAgent.java

Author: azeez
Date: Tue Feb 14 12:04:34 2012
New Revision: 1243888

URL: http://svn.apache.org/viewvc?rev=1243888&view=rev
Log:
Rather than creating a new classloader array everytime a Tribes message is received, we use an AxisObserver which will notify the relevant code to update the classloader array when service & modules are deployed & undeployed.


Added:
    axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/TribesAxisObserver.java
Modified:
    axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/Axis2ChannelListener.java
    axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/Axis2GroupChannel.java
    axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/ClassLoaderUtil.java
    axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/TribesClusteringAgent.java

Modified: axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/Axis2ChannelListener.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/Axis2ChannelListener.java?rev=1243888&r1=1243887&r2=1243888&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/Axis2ChannelListener.java (original)
+++ axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/Axis2ChannelListener.java Tue Feb 14 12:04:34 2012
@@ -91,7 +91,7 @@ public class Axis2ChannelListener implem
             msg = XByteBuffer.deserialize(message,
                                           0,
                                           message.length,
-                                          ClassLoaderUtil.getClassLoaders(configurationContext));
+                                          ClassLoaderUtil.getClassLoaders());
         } catch (Exception e) {
             String errMsg = "Cannot deserialize received message";
             log.error(errMsg, e);

Modified: axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/Axis2GroupChannel.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/Axis2GroupChannel.java?rev=1243888&r1=1243887&r2=1243888&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/Axis2GroupChannel.java (original)
+++ axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/Axis2GroupChannel.java Tue Feb 14 12:04:34 2012
@@ -39,12 +39,6 @@ import java.io.Serializable;
  */
 public class Axis2GroupChannel extends GroupChannel{
 
-    private ConfigurationContext configurationContext;
-
-    public Axis2GroupChannel(ConfigurationContext configurationContext) {
-        this.configurationContext = configurationContext;
-    }
-
     @Override
     public void messageReceived(ChannelMessage msg) {
         if ( msg == null ) return;
@@ -62,7 +56,7 @@ public class Axis2GroupChannel extends G
                 try {
                     fwd = XByteBuffer.deserialize(msg.getMessage().getBytesDirect(), 0,
                                                   msg.getMessage().getLength(),
-                                                  ClassLoaderUtil.getClassLoaders(configurationContext));
+                                                  ClassLoaderUtil.getClassLoaders());
                 }catch (Exception sx) {
                     log.error("Unable to deserialize message:"+msg,sx);
                     return;

Modified: axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/ClassLoaderUtil.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/ClassLoaderUtil.java?rev=1243888&r1=1243887&r2=1243888&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/ClassLoaderUtil.java (original)
+++ axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/ClassLoaderUtil.java Tue Feb 14 12:04:34 2012
@@ -17,33 +17,61 @@
 */
 package org.apache.axis2.clustering.tribes;
 
-import org.apache.axis2.context.ConfigurationContext;
 import org.apache.axis2.description.AxisModule;
 import org.apache.axis2.description.AxisServiceGroup;
 import org.apache.axis2.engine.AxisConfiguration;
 
-import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.Iterator;
-import java.util.List;
+import java.util.Map;
 
 /**
  * A util for manipulating classloaders to be used while serializing & deserializing Tribes messages
  */
 public class ClassLoaderUtil {
 
-    public static ClassLoader[] getClassLoaders(ConfigurationContext configurationContext) {
-        AxisConfiguration configuration = configurationContext.getAxisConfiguration();
-        List<ClassLoader> classLoaders = new ArrayList<ClassLoader>();
-        classLoaders.add(configuration.getSystemClassLoader());
-        classLoaders.add(ClassLoaderUtil.class.getClassLoader());
+    private static Map<String, ClassLoader> classLoaders = new HashMap<String, ClassLoader>();
+
+    public static void init(AxisConfiguration configuration) {
+        classLoaders.put("system", configuration.getSystemClassLoader());
+        classLoaders.put("axis2", ClassLoaderUtil.class.getClassLoader());
         for (Iterator iter = configuration.getServiceGroups(); iter.hasNext(); ) {
             AxisServiceGroup group = (AxisServiceGroup) iter.next();
-            classLoaders.add(group.getServiceGroupClassLoader());
+            classLoaders.put(getServiceGroupMapKey(group), group.getServiceGroupClassLoader());
         }
         for (Object obj : configuration.getModules().values()) {
             AxisModule module = (AxisModule) obj;
-            classLoaders.add(module.getModuleClassLoader());
+            classLoaders.put(getModuleMapKey(module), module.getModuleClassLoader());
         }
-        return classLoaders.toArray(new ClassLoader[classLoaders.size()]);
+    }
+
+    public static void addServiceGroupClassLoader(AxisServiceGroup serviceGroup) {
+        classLoaders.put(getServiceGroupMapKey(serviceGroup),
+                         serviceGroup.getServiceGroupClassLoader());
+    }
+
+    public static void removeServiceGroupClassLoader(AxisServiceGroup serviceGroup) {
+        classLoaders.remove(getServiceGroupMapKey(serviceGroup));
+    }
+
+    private static String getServiceGroupMapKey(AxisServiceGroup serviceGroup) {
+        return serviceGroup.getServiceGroupName() + "$#sg";
+    }
+
+    public static void addModuleClassLoader(AxisModule module) {
+        classLoaders.put(getModuleMapKey(module),
+                         module.getModuleClassLoader());
+    }
+
+    public static void removeModuleClassLoader(AxisModule axisModule) {
+        classLoaders.remove(getModuleMapKey(axisModule));
+    }
+
+    private static String getModuleMapKey(AxisModule module) {
+        return module.getName() + "-" + module.getVersion() + "$#mod";
+    }
+
+    public static ClassLoader[] getClassLoaders() {
+        return classLoaders.values().toArray(new ClassLoader[classLoaders.size()]);
     }
 }

Added: axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/TribesAxisObserver.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/TribesAxisObserver.java?rev=1243888&view=auto
==============================================================================
--- axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/TribesAxisObserver.java (added)
+++ axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/TribesAxisObserver.java Tue Feb 14 12:04:34 2012
@@ -0,0 +1,84 @@
+/*
+*  Copyright (c) 2005-2011, WSO2 Inc. (http://www.wso2.org) All Rights Reserved.
+*
+*  WSO2 Inc. licenses this file to you 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.tribes;
+
+import org.apache.axiom.om.OMElement;
+import org.apache.axis2.AxisFault;
+import org.apache.axis2.description.AxisModule;
+import org.apache.axis2.description.AxisService;
+import org.apache.axis2.description.AxisServiceGroup;
+import org.apache.axis2.description.Parameter;
+import org.apache.axis2.engine.AxisConfiguration;
+import org.apache.axis2.engine.AxisEvent;
+import org.apache.axis2.engine.AxisObserver;
+
+import java.util.ArrayList;
+
+/**
+ * AxisObserver which specifically handles setting of service & module classloaders for
+ * message deserialization by Tribes
+ */
+public class TribesAxisObserver implements AxisObserver {
+    public void init(AxisConfiguration axisConfiguration) {
+        //Nothing to do
+    }
+
+    public void serviceUpdate(AxisEvent axisEvent, AxisService axisService) {
+        //Nothing to do
+    }
+
+    public void serviceGroupUpdate(AxisEvent axisEvent, AxisServiceGroup axisServiceGroup) {
+        if (axisEvent.getEventType() == AxisEvent.SERVICE_DEPLOY) {
+            ClassLoaderUtil.addServiceGroupClassLoader(axisServiceGroup);
+        } else if (axisEvent.getEventType() == AxisEvent.SERVICE_REMOVE) {
+            ClassLoaderUtil.removeServiceGroupClassLoader(axisServiceGroup);
+        }
+    }
+
+    public void moduleUpdate(AxisEvent axisEvent, AxisModule axisModule) {
+        if (axisEvent.getEventType() == AxisEvent.MODULE_DEPLOY) {
+            ClassLoaderUtil.addModuleClassLoader(axisModule);
+        } else if (axisEvent.getEventType() == AxisEvent.MODULE_DEPLOY) {
+            ClassLoaderUtil.removeModuleClassLoader(axisModule);
+        }
+    }
+
+    public void addParameter(Parameter parameter) throws AxisFault {
+        //Nothing to do
+    }
+
+    public void removeParameter(Parameter parameter) throws AxisFault {
+        //Nothing to do
+    }
+
+    public void deserializeParameters(OMElement omElement) throws AxisFault {
+        //Nothing to do
+    }
+
+    public Parameter getParameter(String carbonHome) {
+        return null;          //Nothing to do
+    }
+
+    public ArrayList<Parameter> getParameters() {
+        return null;          //Nothing to do
+    }
+
+    public boolean isParameterLocked(String carbonHome) {
+        return false;         //Nothing to do
+    }
+}

Modified: axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/TribesClusteringAgent.java
URL: http://svn.apache.org/viewvc/axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/TribesClusteringAgent.java?rev=1243888&r1=1243887&r2=1243888&view=diff
==============================================================================
--- axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/TribesClusteringAgent.java (original)
+++ axis/axis2/java/core/trunk/modules/clustering/src/org/apache/axis2/clustering/tribes/TribesClusteringAgent.java Tue Feb 14 12:04:34 2012
@@ -22,7 +22,14 @@ package org.apache.axis2.clustering.trib
 import org.apache.axiom.om.OMAttribute;
 import org.apache.axiom.om.OMElement;
 import org.apache.axis2.AxisFault;
-import org.apache.axis2.clustering.*;
+import org.apache.axis2.clustering.ClusteringAgent;
+import org.apache.axis2.clustering.ClusteringCommand;
+import org.apache.axis2.clustering.ClusteringConstants;
+import org.apache.axis2.clustering.ClusteringFault;
+import org.apache.axis2.clustering.ClusteringMessage;
+import org.apache.axis2.clustering.MembershipListener;
+import org.apache.axis2.clustering.MembershipScheme;
+import org.apache.axis2.clustering.RequestBlockingHandler;
 import org.apache.axis2.clustering.control.ControlCommand;
 import org.apache.axis2.clustering.control.GetConfigurationCommand;
 import org.apache.axis2.clustering.control.GetStateCommand;
@@ -47,7 +54,6 @@ import org.apache.catalina.tribes.ErrorH
 import org.apache.catalina.tribes.ManagedChannel;
 import org.apache.catalina.tribes.Member;
 import org.apache.catalina.tribes.UniqueId;
-import org.apache.catalina.tribes.group.GroupChannel;
 import org.apache.catalina.tribes.group.Response;
 import org.apache.catalina.tribes.group.RpcChannel;
 import org.apache.catalina.tribes.transport.MultiPointSender;
@@ -156,7 +162,7 @@ public class TribesClusteringAgent imple
         addRequestBlockingHandlerToInFlows();
         primaryMembershipManager = new MembershipManager(configurationContext);
 
-        channel = new Axis2GroupChannel(configurationContext);
+        channel = new Axis2GroupChannel();
         channel.setHeartbeat(true);
         channelSender = new ChannelSender(channel, primaryMembershipManager, synchronizeAllMembers());
         axis2ChannelListener =
@@ -211,6 +217,9 @@ public class TribesClusteringAgent imple
 
         membershipScheme.joinGroup();
 
+        configurationContext.getAxisConfiguration().addObservers(new TribesAxisObserver());
+        ClassLoaderUtil.init(configurationContext.getAxisConfiguration());
+
         // If configuration management is enabled, get the latest config from a neighbour
         if (configurationManager != null) {
             configurationManager.setSender(channelSender);
@@ -225,7 +234,6 @@ public class TribesClusteringAgent imple
             ClusteringContextListener contextListener = new ClusteringContextListener(channelSender);
             configurationContext.addContextListener(contextListener);
         }
-        configurationContext.getAxisConfiguration().addObservers(new TribesAxisObserver());
         configurationContext.
                 setNonReplicableProperty(ClusteringConstants.CLUSTER_INITIALIZED, "true");
         log.info("Cluster initialization completed.");