Author: isudana
Date: Sun Jul 13 07:35:52 2014
New Revision: 1610131
URL: http://svn.apache.org/r1610131
Log:
fix for SYNAPSE-989
Modified:
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/DeliveryAgent.java
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetHandler.java
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/HostConnections.java
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/TargetConnections.java
Modified:
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/DeliveryAgent.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/DeliveryAgent.java?rev=1610131&r1=1610130&r2=1610131&view=diff
==============================================================================
---
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/DeliveryAgent.java
(original)
+++
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/DeliveryAgent.java
Sun Jul 13 07:35:52 2014
@@ -157,8 +157,9 @@ public class DeliveryAgent {
*
* @param host name of the remote host
* @param port remote port number
+ * @param conn connection made available to process the request
*/
- public void connected(String host, int port) {
+ public void connected(String host, int port, NHttpClientConnection conn) {
Queue<MessageContext> queue = null;
lock.lock();
try {
@@ -168,13 +169,19 @@ public class DeliveryAgent {
}
while (queue.size() > 0) {
- NHttpClientConnection conn = targetConnections.getConnection(host,
port);
+ if (conn == null) {
+ // Try to get an existing connection from pool. Here we should
not ask to create
+ // new connections as it may ended up with extra connections.
New connections are
+ // created upon request submission.
+ conn = targetConnections.getExistingConnection(host, port);
+ }
if (conn != null) {
MessageContext messageContext = queue.poll();
if (messageContext != null) {
tryNextMessage(messageContext, conn);
}
+ conn = null;
} else {
break;
}
Modified:
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetHandler.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetHandler.java?rev=1610131&r1=1610130&r2=1610131&view=diff
==============================================================================
---
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetHandler.java
(original)
+++
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/TargetHandler.java
Sun Jul 13 07:35:52 2014
@@ -19,8 +19,6 @@
package org.apache.synapse.transport.passthru;
-import java.io.IOException;
-
import org.apache.axis2.AxisFault;
import org.apache.axis2.context.MessageContext;
import org.apache.axis2.description.WSDL2Constants;
@@ -32,12 +30,18 @@ import org.apache.http.HttpException;
import org.apache.http.HttpResponse;
import org.apache.http.HttpStatus;
import org.apache.http.impl.nio.DefaultNHttpClientConnection;
-import org.apache.http.nio.*;
+import org.apache.http.nio.ContentDecoder;
+import org.apache.http.nio.ContentEncoder;
+import org.apache.http.nio.NHttpClientConnection;
+import org.apache.http.nio.NHttpClientEventHandler;
+import org.apache.http.nio.NHttpServerConnection;
import org.apache.synapse.transport.nhttp.NhttpConstants;
import org.apache.synapse.transport.passthru.config.TargetConfiguration;
import org.apache.synapse.transport.passthru.connections.HostConnections;
import
org.apache.synapse.transport.passthru.jmx.PassThroughTransportMetricsCollector;
+import java.io.IOException;
+
/**
* This class is handling events from the transport -- > client.
*/
@@ -77,7 +81,7 @@ public class TargetHandler implements NH
targetConfiguration.getConnections().addConnection(conn);
// notify about the new connection
- deliveryAgent.connected(pool.getHost(), pool.getPort());
+ deliveryAgent.connected(pool.getHost(), pool.getPort(), conn);
conn.getContext().setAttribute(PassThroughConstants.REQ_DEPARTURE_TIME,
System.currentTimeMillis());
Modified:
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/HostConnections.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/HostConnections.java?rev=1610131&r1=1610130&r2=1610131&view=diff
==============================================================================
---
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/HostConnections.java
(original)
+++
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/HostConnections.java
Sun Jul 13 07:35:52 2014
@@ -118,7 +118,9 @@ public class HostConnections {
}
lock.lock();
try {
- freeConnections.add(conn);
+ // Adding to busyConnections to make sure the first requester get
it.
+ // Otherwise someone else might acquire it.
+ busyConnections.add(conn);
} finally {
lock.unlock();
}
Modified:
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/TargetConnections.java
URL:
http://svn.apache.org/viewvc/synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/TargetConnections.java?rev=1610131&r1=1610130&r2=1610131&view=diff
==============================================================================
---
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/TargetConnections.java
(original)
+++
synapse/trunk/java/modules/transports/core/nhttp/src/main/java/org/apache/synapse/transport/passthru/connections/TargetConnections.java
Sun Jul 13 07:35:52 2014
@@ -104,6 +104,23 @@ public class TargetConnections {
}
/**
+ * Return an existing connection to the host:port pair from connection
pool.
+ * If a connection is not available, return <code>null</code>
+ *
+ * @param host host
+ * @param port port
+ * @return returns a connection if already available in the pool
+ */
+ public NHttpClientConnection getExistingConnection(String host, int port) {
+ if (log.isDebugEnabled()) {
+ log.debug("Trying to get an existing connection to the " + host +
":" + port);
+ }
+
+ HostConnections pool = getConnectionPool(host, port);
+ return pool.getConnection();
+ }
+
+ /**
* This connection is no longer needed. So we need to close connection.
*
* @param conn connection to shutdownConnection
@@ -188,17 +205,16 @@ public class TargetConnections {
private HostConnections getConnectionPool(String host, int port) {
String key = host + ":" + port;
- // see weather a pool already exists for this host:port
- HostConnections pool = poolMap.get(key);
+ HostConnections pool;
synchronized (poolMap) {
+ // see weather a pool already exists for this host:port
+ pool = poolMap.get(key);
if (pool == null) {
pool = new HostConnections(host, port, maxConnections);
poolMap.put(key, pool);
}
}
-
return pool;
}
-
}