[Carbon-commits] [Carbon] svn commit r113738 - branches/carbon/3.2.0/dependencies/synapse/2.1.0-wso2v4/modules/core/src/main/java/org/apache/synapse/endpoints

hiranya at wso2.com hiranya at wso2.com
Wed Oct 12 03:20:11 EDT 2011


Author: hiranya
Date: Wed Oct 12 00:20:11 2011
New Revision: 113738
URL: http://wso2.org/svn/browse/wso2?view=rev&revision=113738

Log:
Supporting LB on multiple HTTP ports on the same server

Modified:
   branches/carbon/3.2.0/dependencies/synapse/2.1.0-wso2v4/modules/core/src/main/java/org/apache/synapse/endpoints/DynamicLoadbalanceEndpoint.java

Modified: branches/carbon/3.2.0/dependencies/synapse/2.1.0-wso2v4/modules/core/src/main/java/org/apache/synapse/endpoints/DynamicLoadbalanceEndpoint.java
URL: http://wso2.org/svn/browse/wso2/branches/carbon/3.2.0/dependencies/synapse/2.1.0-wso2v4/modules/core/src/main/java/org/apache/synapse/endpoints/DynamicLoadbalanceEndpoint.java?rev=113738&r1=113737&r2=113738&view=diff
==============================================================================
--- branches/carbon/3.2.0/dependencies/synapse/2.1.0-wso2v4/modules/core/src/main/java/org/apache/synapse/endpoints/DynamicLoadbalanceEndpoint.java	(original)
+++ branches/carbon/3.2.0/dependencies/synapse/2.1.0-wso2v4/modules/core/src/main/java/org/apache/synapse/endpoints/DynamicLoadbalanceEndpoint.java	Wed Oct 12 00:20:11 2011
@@ -40,12 +40,7 @@
 
 import java.net.MalformedURLException;
 import java.net.URL;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.UUID;
+import java.util.*;
 
 /**
  * Represents a dynamic load balance endpoint. The application membership is not static,
@@ -55,6 +50,8 @@
 
     private static final Log log = LogFactory.getLog(DynamicLoadbalanceEndpoint.class);
 
+    private static final String PORT_MAPPING_PREFIX = "port.mapping.";
+
     /**
      *  Flag to enable session affinity based load balancing.
      */
@@ -182,8 +179,7 @@
                 Object cookieObj = headerMap.get(key);
 
                 if (cookieObj instanceof String) {
-                    String cookie = (String) cookieObj;
-                    return cookie;
+                    return (String) cookieObj;
                 } else {
                     if (log.isDebugEnabled()) {
                         log.debug("Couldn't find the " + key + " header to find the session");
@@ -216,7 +212,7 @@
 //        algorithmContext.setContextID(name);
     }
 
-  public Dispatcher getDispatcher() {
+    public Dispatcher getDispatcher() {
         return dispatcher;
     }
 
@@ -241,9 +237,9 @@
     }
 
     protected void sendToApplicationMember(MessageContext synCtx,
-                                         Member currentMember,
-                                         DynamicLoadbalanceFaultHandler faultHandler,
-                                         boolean newSession) {
+                                           Member currentMember,
+                                           DynamicLoadbalanceFaultHandler faultHandler,
+                                           boolean newSession) {
         //Rewriting the URL
         org.apache.axis2.context.MessageContext axis2MsgCtx =
                 ((Axis2MessageContext) synCtx).getAxis2MessageContext();
@@ -256,8 +252,9 @@
 
         String transport = axis2MsgCtx.getTransportIn().getName();
         String address = synCtx.getTo().getAddress();
+        int incomingPort = extractPort(synCtx, transport);
         EndpointReference to = getEndpointReferenceAfterURLRewrite(currentMember,
-                transport, address);
+                transport, address, incomingPort);
         synCtx.setTo(to);
 
         faultHandler.setTo(to);
@@ -282,7 +279,7 @@
         Map<String, String> memberHosts;
         if ((memberHosts = (Map<String, String>) currentMember.getProperties().get(HttpSessionDispatcher.HOSTS)) == null) {
             currentMember.getProperties().put(HttpSessionDispatcher.HOSTS,
-                                              memberHosts = new HashMap<String, String>());
+                    memberHosts = new HashMap<String, String>());
         }
         memberHosts.put(extractHost(synCtx), "true");
 
@@ -330,9 +327,11 @@
 
     private EndpointReference getEndpointReferenceAfterURLRewrite(Member currentMember,
                                                                   String transport,
-                                                                  String address) {
-        // URL rewrite
-        if (transport.equals("http") || transport.equals("https")) {
+                                                                  String address,
+                                                                  int incomingPort) {
+
+        // URL Rewrite
+        if ("http".equals(transport) || "https".equals(transport)) {
             if (address.startsWith("http://") || address.startsWith("https://")) {
                 try {
                     address = new URL(address).getPath();
@@ -343,9 +342,19 @@
                 }
             }
 
+            int port;
+            Properties memberProperties = currentMember.getProperties();
+            String mappedPort = memberProperties.getProperty(PORT_MAPPING_PREFIX + incomingPort);
+            if (mappedPort != null) {
+                port = Integer.parseInt(mappedPort);
+            } else if ("http".equals(transport)) {
+                port = currentMember.getHttpPort();
+            } else {
+                port = currentMember.getHttpsPort();
+            }
+
             return new EndpointReference(transport + "://" + currentMember.getHostName() +
-                    ":" + ("http".equals(transport) ? currentMember.getHttpPort() :
-                    currentMember.getHttpsPort()) + address);
+                    ":" + port + address);
         } else {
             String msg = "Cannot load balance for non-HTTP/S transport " + transport;
             log.error(msg);
@@ -364,7 +373,7 @@
         AddressEndpoint endpoint = new AddressEndpoint();
         endpoint.setEnableMBeanStats(false);
         endpoint.setName("DLB:" +  member.getHostName() +
-                           ":" + member.getPort() + ":" + UUID.randomUUID());
+                ":" + member.getPort() + ":" + UUID.randomUUID());
         EndpointDefinition definition = new EndpointDefinition();
         definition.setSuspendMaximumDuration(10000);
         definition.setReplicationDisabled(true);
@@ -378,20 +387,44 @@
     }
 
     private String extractHost(MessageContext synCtx) {
-       org.apache.axis2.context.MessageContext msgCtx =
-               ((Axis2MessageContext) synCtx).getAxis2MessageContext();
+        org.apache.axis2.context.MessageContext msgCtx =
+                ((Axis2MessageContext) synCtx).getAxis2MessageContext();
+
+        Map headerMap = (Map) msgCtx.getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
+        String hostName = null;
+        if (headerMap != null) {
+            Object hostObj = headerMap.get(HTTP.TARGET_HOST);
+            hostName = (String) hostObj;
+            if (hostName.contains(":")) {
+                hostName = hostName.substring(0, hostName.indexOf(":"));
+            }
+        }
+        return hostName;
+    }
+
+    private int extractPort(MessageContext synCtx, String transport) {
+        org.apache.axis2.context.MessageContext msgCtx =
+                ((Axis2MessageContext) synCtx).getAxis2MessageContext();
+
+        Map headerMap = (Map) msgCtx.getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
+        int port = -1;
+        if (headerMap != null) {
+            String hostHeader = (String) headerMap.get(HTTP.TARGET_HOST);
+            int index = hostHeader.indexOf(':');
+            if (index != -1) {
+                port = Integer.parseInt(hostHeader.trim().substring(index + 1));
+            } else {
+                if ("http".equals(transport)) {
+                    port = 80;
+                } else if ("https".equals(transport)) {
+                    port = 443;
+                }
+            }
+        }
+        return port;
+    }
+
 
-       Map headerMap = (Map) msgCtx.getProperty(org.apache.axis2.context.MessageContext.TRANSPORT_HEADERS);
-       String hostName = null;
-       if (headerMap != null) {
-           Object hostObj = headerMap.get(HTTP.TARGET_HOST);
-           hostName = (String) hostObj;
-           if (hostName.contains(":")) {
-               hostName = hostName.substring(0, hostName.indexOf(":"));
-           }
-       }
-       return hostName;
-   }
 
     /**
      * This FaultHandler will try to resend the message to another member if an error occurs


More information about the Carbon-commits mailing list