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.");