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 2008/06/09 18:48:23 UTC

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

Author: azeez
Date: Mon Jun  9 09:48:23 2008
New Revision: 665759

URL: http://svn.apache.org/viewvc?rev=665759&view=rev
Log:
1. Handling member specific properties in a more elegant manner
2. The load balancer impl needs to be able to retrieve the LoadBalanceEvent handler instance



Modified:
    webservices/axis2/trunk/java/modules/clustering/src/org/apache/axis2/clustering/DefaultLoadBalanceEventHandler.java
    webservices/axis2/trunk/java/modules/clustering/src/org/apache/axis2/clustering/tribes/LoadBalancerInterceptor.java
    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/LoadBalanceEventHandler.java

Modified: webservices/axis2/trunk/java/modules/clustering/src/org/apache/axis2/clustering/DefaultLoadBalanceEventHandler.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/clustering/src/org/apache/axis2/clustering/DefaultLoadBalanceEventHandler.java?rev=665759&r1=665758&r2=665759&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/clustering/src/org/apache/axis2/clustering/DefaultLoadBalanceEventHandler.java (original)
+++ webservices/axis2/trunk/java/modules/clustering/src/org/apache/axis2/clustering/DefaultLoadBalanceEventHandler.java Mon Jun  9 09:48:23 2008
@@ -18,18 +18,29 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import java.util.List;
+import java.util.ArrayList;
+
 /**
  * The default, dummy implementation of {@link LoadBalanceEventHandler}
  */
 public class DefaultLoadBalanceEventHandler implements LoadBalanceEventHandler{
 
     private static final Log log  = LogFactory.getLog(DefaultLoadBalanceEventHandler.class);
+    private List<Member> members = new ArrayList<Member>();
 
     public void applicationMemberAdded(Member member) {
         log.info("Application member " + member + " joined cluster.");
+        members.add(member);
     }
 
     public void applicationMemberRemoved(Member member) {
         log.info("Application member " + member + " left cluster.");
+        members.remove(member);
+    }
+
+    public List<Member> getMembers() {
+        return members;
     }
+
 }

Modified: webservices/axis2/trunk/java/modules/clustering/src/org/apache/axis2/clustering/tribes/LoadBalancerInterceptor.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/clustering/src/org/apache/axis2/clustering/tribes/LoadBalancerInterceptor.java?rev=665759&r1=665758&r2=665759&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/clustering/src/org/apache/axis2/clustering/tribes/LoadBalancerInterceptor.java (original)
+++ webservices/axis2/trunk/java/modules/clustering/src/org/apache/axis2/clustering/tribes/LoadBalancerInterceptor.java Mon Jun  9 09:48:23 2008
@@ -15,6 +15,7 @@
  */
 package org.apache.axis2.clustering.tribes;
 
+import org.apache.axis2.clustering.LoadBalanceEventHandler;
 import org.apache.catalina.tribes.ChannelMessage;
 import org.apache.catalina.tribes.Member;
 import org.apache.catalina.tribes.group.ChannelInterceptorBase;
@@ -22,11 +23,13 @@
 import org.apache.catalina.tribes.membership.Membership;
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
-import org.apache.axis2.clustering.LoadBalanceEventHandler;
 
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
-import java.util.ArrayList;
+import java.util.Properties;
 
 /**
  * This interceptor is used when this member is part of a load balancer cluster.
@@ -87,22 +90,19 @@
         }
         if (notify) {
             super.memberAdded(member);
-            
+
         }
 
         // Is this an application domain member?
         if (Arrays.equals(applicationDomain, member.getDomain())) {
             log.info("Application member " + TribesUtil.getName(member) + " joined cluster");
-            if(eventHandler != null){
+            if (eventHandler != null) {
                 org.apache.axis2.clustering.Member axis2Member =
                         new org.apache.axis2.clustering.Member(TribesUtil.getHost(member),
                                                                member.getPort());
-                byte[] payload = member.getPayload();
-                String payloadStr = new String(payload);
-
-                String[] ports = payloadStr.split(";");
-                int httpPort = Integer.parseInt(ports[0].substring(ports[0].indexOf(":") + 1));
-                int httpsPort = Integer.parseInt(ports[1].substring(ports[1].indexOf(":") + 1));
+                Properties props = getProperties(member.getPayload());
+                int httpPort = Integer.parseInt(props.getProperty("HTTP"));
+                int httpsPort = Integer.parseInt(props.getProperty("HTTPS"));
                 axis2Member.setHttpPort(httpPort);
                 axis2Member.setHttpsPort(httpsPort);
                 eventHandler.applicationMemberAdded(axis2Member);
@@ -112,6 +112,18 @@
 
     }
 
+    private Properties getProperties(byte[] payload) {
+        Properties props = null;
+        try {
+            ByteArrayInputStream bin = new ByteArrayInputStream(payload);
+            props = new Properties();
+            props.load(bin);
+        } catch (IOException ignored) {
+            // This error will never occur
+        }
+        return props;
+    }
+
     public void memberDisappeared(Member member) {
         if (loadBalancerMembership == null) {
             setupMembership();
@@ -128,7 +140,7 @@
         // Is this an application domain member?
         if (Arrays.equals(applicationDomain, member.getDomain())) {
             log.info("Application member " + TribesUtil.getName(member) + " left cluster");
-            if(eventHandler != null){
+            if (eventHandler != null) {
                 org.apache.axis2.clustering.Member axis2Member =
                         new org.apache.axis2.clustering.Member(member.getName(), member.getPort());
                 eventHandler.applicationMemberRemoved(axis2Member);

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?rev=665759&r1=665758&r2=665759&view=diff
==============================================================================
--- 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 Mon Jun  9 09:48:23 2008
@@ -65,6 +65,7 @@
 import org.apache.commons.logging.Log;
 import org.apache.commons.logging.LogFactory;
 
+import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.net.InetAddress;
 import java.net.InetSocketAddress;
@@ -98,6 +99,7 @@
     private RpcRequestHandler rpcRequestHandler;
     private StaticMembershipInterceptor staticMembershipInterceptor;
     private List<org.apache.axis2.clustering.Member> members;
+    private LoadBalanceEventHandler lbEventHandler;
 
     public TribesClusterManager() {
         parameters = new HashMap<String, Parameter>();
@@ -111,6 +113,10 @@
         return members;
     }
 
+    public LoadBalanceEventHandler getLoadBalanceEventHandler() {
+        return lbEventHandler;
+    }
+
     public ContextManager getContextManager() {
         return contextManager;
     }
@@ -266,24 +272,32 @@
         log.info("Cluster initialization completed.");
     }
 
-    private void setMemberTransportInfo() {
-        String payload = "";
+    private void setMemberTransportInfo() throws ClusteringFault {
+        Properties transportInfo = new Properties();
         AxisConfiguration axisConfig = configurationContext.getAxisConfiguration();
         TransportInDescription httpTransport = axisConfig.getTransportIn("http");
         if (httpTransport != null) {
             Parameter port = httpTransport.getParameter("port");
             if (port != null) {
-                payload +="HTTP:" + Integer.parseInt((String) port.getValue()) + ";";
+                transportInfo.put("HTTP", port.getValue());
             }
         }
         TransportInDescription httpsTransport = axisConfig.getTransportIn("https");
         if (httpsTransport != null) {
             Parameter port = httpsTransport.getParameter("port");
             if (port != null) {
-                payload +="HTTPS:" + Integer.parseInt((String) port.getValue()) + ";";
+                transportInfo.put("HTTPS", port.getValue());
             }
         }
-        channel.getMembershipService().setPayload(payload.getBytes());
+        ByteArrayOutputStream bout = new ByteArrayOutputStream();
+        try {
+            transportInfo.store(bout, "");
+        } catch (IOException e) {
+            String msg = "Cannot store member transport properties in the ByteArrayOutputStream";
+            log.error(msg, e);
+            throw new ClusteringFault(msg, e);
+        }
+        channel.getMembershipService().setPayload(bout.toByteArray());
     }
 
     /**
@@ -674,8 +688,9 @@
             if (lbEvtHandlerParam != null && lbEvtHandlerParam.getValue() != null) {
                 String lbEvtHandlerClass = ((String) lbEvtHandlerParam.getValue()).trim();
                 try {
-                    lbInterceptor.
-                            setEventHandler((LoadBalanceEventHandler) Class.forName(lbEvtHandlerClass).newInstance());
+                    lbEventHandler =
+                            (LoadBalanceEventHandler) Class.forName(lbEvtHandlerClass).newInstance();
+                    lbInterceptor.setEventHandler(lbEventHandler);
                 } catch (Exception e) {
                     String msg = "Could not instantiate LoadBalanceEventHandler class " +
                                  lbEvtHandlerClass;

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?rev=665759&r1=665758&r2=665759&view=diff
==============================================================================
--- 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 Mon Jun  9 09:48:23 2008
@@ -150,4 +150,11 @@
      */
     List<Member> getMembers();
 
+    /**
+     * Get the load balance event handler which will be notified when load balance events occur.
+     * This will be valid only when this node is running in loadBalance mode
+     *
+     * @return The load balance event handler
+     */
+    LoadBalanceEventHandler getLoadBalanceEventHandler();
 }
\ No newline at end of file

Modified: webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/LoadBalanceEventHandler.java
URL: http://svn.apache.org/viewvc/webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/LoadBalanceEventHandler.java?rev=665759&r1=665758&r2=665759&view=diff
==============================================================================
--- webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/LoadBalanceEventHandler.java (original)
+++ webservices/axis2/trunk/java/modules/kernel/src/org/apache/axis2/clustering/LoadBalanceEventHandler.java Mon Jun  9 09:48:23 2008
@@ -15,6 +15,8 @@
  */
 package org.apache.axis2.clustering;
 
+import java.util.List;
+
 /**
  * This is the interface through which the load balancing event are notified.
  * This will only be used when this member is running in loadBalance mode. In order to do this,
@@ -36,4 +38,11 @@
      * @param member Represents the member who left
      */
     void applicationMemberRemoved(Member member);
+
+    /**
+     * Get the list of current members
+     *
+     * @return List of current members
+     */
+    List<Member> getMembers();
 }