You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by fh...@apache.org on 2010/12/20 17:42:14 UTC

svn commit: r1051202 - in /tomcat/trunk: java/org/apache/tomcat/util/net/JIoEndpoint.java test/org/apache/catalina/connector/TestMaxConnections.java test/org/apache/catalina/startup/SimpleHttpClient.java webapps/docs/config/http.xml

Author: fhanik
Date: Mon Dec 20 16:42:13 2010
New Revision: 1051202

URL: http://svn.apache.org/viewvc?rev=1051202&view=rev
Log:
Implement a maxConnection threshold for the JIoEndpoint, to be able to constraint how many connections the connector will accept

Added:
    tomcat/trunk/test/org/apache/catalina/connector/TestMaxConnections.java   (with props)
Modified:
    tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java
    tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java
    tomcat/trunk/webapps/docs/config/http.xml

Modified: tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java?rev=1051202&r1=1051201&r2=1051202&view=diff
==============================================================================
--- tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java (original)
+++ tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java Mon Dec 20 16:42:13 2010
@@ -32,6 +32,7 @@ import org.apache.juli.logging.Log;
 import org.apache.juli.logging.LogFactory;
 import org.apache.tomcat.util.ExceptionUtils;
 import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState;
+import org.apache.tomcat.util.threads.CounterLatch;
 
 
 /**
@@ -107,6 +108,8 @@ public class JIoEndpoint extends Abstrac
         // Not supported
         return false;
     }
+    
+    protected CounterLatch connectionCounterLatch = null;
 
 
     // ------------------------------------------------ Handler Inner Interface
@@ -197,20 +200,24 @@ public class JIoEndpoint extends Abstrac
                     break;
                 }
                 try {
+                    //if we have reached max connections, wait
+                    connectionCounterLatch.await();
                     // Accept the next incoming connection from the server socket
                     Socket socket = serverSocketFactory.acceptSocket(serverSocket);
                     
                     // Configure the socket
                     if (setSocketOptions(socket)) {
-                    // Hand this socket off to an appropriate processor
-                    if (!processSocket(socket)) {
-                        // Close socket right away
-                        try {
-                            socket.close();
-                        } catch (IOException e) {
-                            // Ignore
+                        // Hand this socket off to an appropriate processor
+                        if (!processSocket(socket)) {
+                            // Close socket right away
+                            try {
+                                socket.close();
+                            } catch (IOException e) {
+                                // Ignore
+                            }
+                        } else {
+                            connectionCounterLatch.countUp();
                         }
-                    }
                     } else {
                         // Close socket right away
                         try {
@@ -286,6 +293,7 @@ public class JIoEndpoint extends Abstrac
                         if (log.isTraceEnabled()) {
                             log.trace("Closing socket:"+socket);
                         }
+                        connectionCounterLatch.countDown();
                         try {
                             socket.getSocket().close();
                         } catch (IOException e) {
@@ -373,6 +381,8 @@ public class JIoEndpoint extends Abstrac
             if (getExecutor() == null) {
                 createExecutor();
             }
+            
+            connectionCounterLatch = new CounterLatch(0,getMaxConnections());
 
             // Start acceptor threads
             for (int i = 0; i < acceptorThreadCount; i++) {
@@ -394,6 +404,8 @@ public class JIoEndpoint extends Abstrac
 
     @Override
     public void stopInternal() {
+        connectionCounterLatch.releaseAll();
+        connectionCounterLatch = null;
         if (!paused) {
             pause();
         }

Added: tomcat/trunk/test/org/apache/catalina/connector/TestMaxConnections.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/connector/TestMaxConnections.java?rev=1051202&view=auto
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/connector/TestMaxConnections.java (added)
+++ tomcat/trunk/test/org/apache/catalina/connector/TestMaxConnections.java Mon Dec 20 16:42:13 2010
@@ -0,0 +1,180 @@
+/*
+ *  Licensed to the Apache Software Foundation (ASF) under one or more
+ *  contributor license agreements.  See the NOTICE file distributed with
+ *  this work for additional information regarding copyright ownership.
+ *  The ASF 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.catalina.connector;
+
+import java.io.IOException;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.apache.catalina.Context;
+import org.apache.catalina.startup.SimpleHttpClient;
+import org.apache.catalina.startup.Tomcat;
+import org.apache.catalina.startup.TomcatBaseTest;
+
+public class TestMaxConnections extends TomcatBaseTest{
+
+    Tomcat tomcat = null;
+    static int soTimeout = 3000;
+    static int connectTimeout = 1000;
+    
+    public void test1() throws Exception {
+        init();
+        start();
+        ConnectThread[] t = new ConnectThread[10];
+        int passcount = 0;
+        int connectfail = 0;
+        for (int i=0; i<t.length; i++) {
+            t[i] = new ConnectThread();
+            t[i].setName("ConnectThread["+i+"+]");
+            t[i].start();
+        }
+        for (int i=0; i<t.length; i++) {
+            t[i].join();
+            if (t[i].passed) passcount++;
+            if (t[i].connectfailed) connectfail++;
+        }
+        assertEquals("The number of successful requests should have been 5.",5, passcount);
+        assertEquals("The number of failed connects should have been 5.",5, connectfail);
+        stop();
+    }
+    
+
+    private class ConnectThread extends Thread {
+        public boolean passed = true;
+        public boolean connectfailed = false;
+        public void run() {
+            try {
+                TestKeepAliveClient client = new TestKeepAliveClient();
+                client.doHttp10Request();
+            }catch (Exception x) {
+                passed = false;
+                System.err.println(Thread.currentThread().getName()+" Error:"+x.getMessage());
+                connectfailed = "connect timed out".equals(x.getMessage());
+            }
+        }
+    }
+
+    private boolean init;
+    
+    private synchronized void init() {
+        if (init) return;
+        
+        Tomcat tomcat = getTomcatInstance();
+        Context root = tomcat.addContext("", SimpleHttpClient.TEMP_DIR);
+        Tomcat.addServlet(root, "Simple", new SimpleServlet());
+        root.addServletMapping("/test", "Simple");
+        tomcat.getConnector().setProperty("maxKeepAliveRequests", "5");
+        tomcat.getConnector().setProperty("soTimeout", "20000");
+        tomcat.getConnector().setProperty("keepAliveTimeout", "50000");
+        tomcat.getConnector().setProperty("port", "8080");
+        tomcat.getConnector().setProperty("maxConnections", "4");
+        tomcat.getConnector().setProperty("acceptCount", "1");
+        init = true;
+    }
+
+    private synchronized void start() throws Exception {
+        tomcat = getTomcatInstance();
+        init();
+        tomcat.start();
+    }
+    
+    private synchronized void stop() throws Exception {
+        tomcat.stop();
+    }
+    
+    private class TestKeepAliveClient extends SimpleHttpClient {
+
+        private void doHttp10Request() throws Exception {
+            
+            long start = System.currentTimeMillis();
+            // Open connection
+            connect(connectTimeout,soTimeout);
+            
+            // Send request in two parts
+            String[] request = new String[1];
+            request[0] =
+                "GET /test HTTP/1.0" + CRLF + CRLF;
+            setRequest(request);
+            boolean passed = false;
+            processRequest(false); // blocks until response has been read
+            long stop = System.currentTimeMillis();
+            System.out.println(Thread.currentThread().getName()+" Request complete:"+(stop-start)+" ms.");
+            passed = (this.readLine()==null);
+            // Close the connection
+            disconnect();
+            reset();
+            assertTrue(passed);
+        }
+        
+        private void doHttp11Request() throws Exception {
+            Tomcat tomcat = getTomcatInstance();
+            init();
+            tomcat.start();
+            // Open connection
+            connect();
+            
+            // Send request in two parts
+            String[] request = new String[1];
+            request[0] =
+                "GET /test HTTP/1.1" + CRLF + 
+                "Host: localhost" + CRLF +
+                "Connection: Keep-Alive" + CRLF+
+                "Keep-Alive: 300"+ CRLF+ CRLF;
+            
+            setRequest(request);
+            
+            for (int i=0; i<5; i++) {
+                processRequest(false); // blocks until response has been read
+                assertTrue(getResponseLine()!=null && getResponseLine().trim().startsWith("HTTP/1.1 200"));
+            }
+            boolean passed = (this.readLine()==null);
+            // Close the connection
+            disconnect();
+            reset();
+            tomcat.stop();
+            assertTrue(passed);
+        }
+        
+        @Override
+        public boolean isResponseBodyOK() {
+            return true;
+        }
+        
+    }
+    
+    
+    private static class SimpleServlet extends HttpServlet {
+
+        private static final long serialVersionUID = 1L;
+
+        @Override
+        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
+            try {
+                Thread.sleep(TestMaxConnections.soTimeout/2);
+            }catch (InterruptedException x) {
+                
+            }
+            resp.setContentLength(0);
+            resp.flushBuffer();
+        }
+        
+    }
+    
+}

Propchange: tomcat/trunk/test/org/apache/catalina/connector/TestMaxConnections.java
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java
URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java?rev=1051202&r1=1051201&r2=1051202&view=diff
==============================================================================
--- tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java (original)
+++ tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java Mon Dec 20 16:42:13 2010
@@ -25,7 +25,9 @@ import java.io.OutputStream;
 import java.io.OutputStreamWriter;
 import java.io.Reader;
 import java.io.Writer;
+import java.net.InetSocketAddress;
 import java.net.Socket;
+import java.net.SocketAddress;
 import java.net.UnknownHostException;
 import java.util.ArrayList;
 import java.util.List;
@@ -109,14 +111,20 @@ public abstract class SimpleHttpClient {
         return null;
     }
 
-    public void connect() throws UnknownHostException, IOException {
-        socket = new Socket("localhost", port);
+    public void connect(int connectTimeout, int soTimeout) throws UnknownHostException, IOException {
+        SocketAddress addr = new InetSocketAddress("localhost", port);
+        socket = new Socket();
+        socket.setSoTimeout(soTimeout);
+        socket.connect(addr,connectTimeout);
         OutputStream os = socket.getOutputStream();
         writer = new OutputStreamWriter(os);
         InputStream is = socket.getInputStream();
         Reader r = new InputStreamReader(is);
         reader = new BufferedReader(r);
     }
+    public void connect() throws UnknownHostException, IOException {
+        connect(0,0);
+    }
     
     public void processRequest() throws IOException, InterruptedException {
         processRequest(true);

Modified: tomcat/trunk/webapps/docs/config/http.xml
URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/http.xml?rev=1051202&r1=1051201&r2=1051202&view=diff
==============================================================================
--- tomcat/trunk/webapps/docs/config/http.xml (original)
+++ tomcat/trunk/webapps/docs/config/http.xml Mon Dec 20 16:42:13 2010
@@ -361,6 +361,15 @@
       execute tasks using the executor rather than an internal thread pool.</p>
     </attribute>
 
+    <attribute name="maxConnections" required="false">
+      <p>The maximum number of connections that the server will accept and process
+      at any given time. When this number has been reached, the server will not accept any more
+      connections until the number of connections reach below this value. The operating system may still accept connections based 
+      on the <code>acceptCount</code> setting.
+      This setting is currently only applicable to the blocking Java connectors (AJP/HTTP).
+      Default value is <code>10000</code>.</p>
+    </attribute>
+
     <attribute name="maxTrailerSize" required="false">
       <p>Limits the total length of trailing headers in the last chunk of
       a chunked HTTP request. If the value is <code>-1</code>, no limit will be



---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org


Re: svn commit: r1051202 - in /tomcat/trunk: java/org/apache/tomcat/util/net/JIoEndpoint.java test/org/apache/catalina/connector/TestMaxConnections.java test/org/apache/catalina/startup/SimpleHttpClient.java webapps/docs/config/http.xml

Posted by sebb <se...@gmail.com>.
On 20 December 2010 16:42,  <fh...@apache.org> wrote:
> Author: fhanik
> Date: Mon Dec 20 16:42:13 2010
> New Revision: 1051202
>
> URL: http://svn.apache.org/viewvc?rev=1051202&view=rev
> Log:
> Implement a maxConnection threshold for the JIoEndpoint, to be able to constraint how many connections the connector will accept
>
> Added:
>    tomcat/trunk/test/org/apache/catalina/connector/TestMaxConnections.java   (with props)
> Modified:
>    tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java
>    tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java
>    tomcat/trunk/webapps/docs/config/http.xml
>
> Modified: tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java
> URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java?rev=1051202&r1=1051201&r2=1051202&view=diff
> ==============================================================================
> --- tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java (original)
> +++ tomcat/trunk/java/org/apache/tomcat/util/net/JIoEndpoint.java Mon Dec 20 16:42:13 2010
> @@ -32,6 +32,7 @@ import org.apache.juli.logging.Log;
>  import org.apache.juli.logging.LogFactory;
>  import org.apache.tomcat.util.ExceptionUtils;
>  import org.apache.tomcat.util.net.AbstractEndpoint.Handler.SocketState;
> +import org.apache.tomcat.util.threads.CounterLatch;
>
>
>  /**
> @@ -107,6 +108,8 @@ public class JIoEndpoint extends Abstrac
>         // Not supported
>         return false;
>     }
> +
> +    protected CounterLatch connectionCounterLatch = null;

Could this be private?

>
>
>     // ------------------------------------------------ Handler Inner Interface
> @@ -197,20 +200,24 @@ public class JIoEndpoint extends Abstrac
>                     break;
>                 }
>                 try {
> +                    //if we have reached max connections, wait
> +                    connectionCounterLatch.await();
>                     // Accept the next incoming connection from the server socket
>                     Socket socket = serverSocketFactory.acceptSocket(serverSocket);
>
>                     // Configure the socket
>                     if (setSocketOptions(socket)) {
> -                    // Hand this socket off to an appropriate processor
> -                    if (!processSocket(socket)) {
> -                        // Close socket right away
> -                        try {
> -                            socket.close();
> -                        } catch (IOException e) {
> -                            // Ignore
> +                        // Hand this socket off to an appropriate processor
> +                        if (!processSocket(socket)) {
> +                            // Close socket right away
> +                            try {
> +                                socket.close();
> +                            } catch (IOException e) {
> +                                // Ignore
> +                            }
> +                        } else {
> +                            connectionCounterLatch.countUp();
>                         }
> -                    }
>                     } else {
>                         // Close socket right away
>                         try {
> @@ -286,6 +293,7 @@ public class JIoEndpoint extends Abstrac
>                         if (log.isTraceEnabled()) {
>                             log.trace("Closing socket:"+socket);
>                         }
> +                        connectionCounterLatch.countDown();
>                         try {
>                             socket.getSocket().close();
>                         } catch (IOException e) {
> @@ -373,6 +381,8 @@ public class JIoEndpoint extends Abstrac
>             if (getExecutor() == null) {
>                 createExecutor();
>             }
> +
> +            connectionCounterLatch = new CounterLatch(0,getMaxConnections());
>
>             // Start acceptor threads
>             for (int i = 0; i < acceptorThreadCount; i++) {
> @@ -394,6 +404,8 @@ public class JIoEndpoint extends Abstrac
>
>     @Override
>     public void stopInternal() {
> +        connectionCounterLatch.releaseAll();
> +        connectionCounterLatch = null;
>         if (!paused) {
>             pause();
>         }
>
> Added: tomcat/trunk/test/org/apache/catalina/connector/TestMaxConnections.java
> URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/connector/TestMaxConnections.java?rev=1051202&view=auto
> ==============================================================================
> --- tomcat/trunk/test/org/apache/catalina/connector/TestMaxConnections.java (added)
> +++ tomcat/trunk/test/org/apache/catalina/connector/TestMaxConnections.java Mon Dec 20 16:42:13 2010
> @@ -0,0 +1,180 @@
> +/*
> + *  Licensed to the Apache Software Foundation (ASF) under one or more
> + *  contributor license agreements.  See the NOTICE file distributed with
> + *  this work for additional information regarding copyright ownership.
> + *  The ASF 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.catalina.connector;
> +
> +import java.io.IOException;
> +
> +import javax.servlet.ServletException;
> +import javax.servlet.http.HttpServlet;
> +import javax.servlet.http.HttpServletRequest;
> +import javax.servlet.http.HttpServletResponse;
> +
> +import org.apache.catalina.Context;
> +import org.apache.catalina.startup.SimpleHttpClient;
> +import org.apache.catalina.startup.Tomcat;
> +import org.apache.catalina.startup.TomcatBaseTest;
> +
> +public class TestMaxConnections extends TomcatBaseTest{
> +
> +    Tomcat tomcat = null;
> +    static int soTimeout = 3000;
> +    static int connectTimeout = 1000;
> +
> +    public void test1() throws Exception {
> +        init();
> +        start();
> +        ConnectThread[] t = new ConnectThread[10];
> +        int passcount = 0;
> +        int connectfail = 0;
> +        for (int i=0; i<t.length; i++) {
> +            t[i] = new ConnectThread();
> +            t[i].setName("ConnectThread["+i+"+]");
> +            t[i].start();
> +        }
> +        for (int i=0; i<t.length; i++) {
> +            t[i].join();
> +            if (t[i].passed) passcount++;
> +            if (t[i].connectfailed) connectfail++;
> +        }
> +        assertEquals("The number of successful requests should have been 5.",5, passcount);
> +        assertEquals("The number of failed connects should have been 5.",5, connectfail);
> +        stop();
> +    }
> +
> +
> +    private class ConnectThread extends Thread {
> +        public boolean passed = true;
> +        public boolean connectfailed = false;
> +        public void run() {
> +            try {
> +                TestKeepAliveClient client = new TestKeepAliveClient();
> +                client.doHttp10Request();
> +            }catch (Exception x) {
> +                passed = false;
> +                System.err.println(Thread.currentThread().getName()+" Error:"+x.getMessage());
> +                connectfailed = "connect timed out".equals(x.getMessage());
> +            }
> +        }
> +    }
> +
> +    private boolean init;
> +
> +    private synchronized void init() {
> +        if (init) return;
> +
> +        Tomcat tomcat = getTomcatInstance();
> +        Context root = tomcat.addContext("", SimpleHttpClient.TEMP_DIR);
> +        Tomcat.addServlet(root, "Simple", new SimpleServlet());
> +        root.addServletMapping("/test", "Simple");
> +        tomcat.getConnector().setProperty("maxKeepAliveRequests", "5");
> +        tomcat.getConnector().setProperty("soTimeout", "20000");
> +        tomcat.getConnector().setProperty("keepAliveTimeout", "50000");
> +        tomcat.getConnector().setProperty("port", "8080");
> +        tomcat.getConnector().setProperty("maxConnections", "4");
> +        tomcat.getConnector().setProperty("acceptCount", "1");
> +        init = true;
> +    }
> +
> +    private synchronized void start() throws Exception {
> +        tomcat = getTomcatInstance();
> +        init();
> +        tomcat.start();
> +    }
> +
> +    private synchronized void stop() throws Exception {
> +        tomcat.stop();
> +    }
> +
> +    private class TestKeepAliveClient extends SimpleHttpClient {
> +
> +        private void doHttp10Request() throws Exception {
> +
> +            long start = System.currentTimeMillis();
> +            // Open connection
> +            connect(connectTimeout,soTimeout);
> +
> +            // Send request in two parts
> +            String[] request = new String[1];
> +            request[0] =
> +                "GET /test HTTP/1.0" + CRLF + CRLF;
> +            setRequest(request);
> +            boolean passed = false;
> +            processRequest(false); // blocks until response has been read
> +            long stop = System.currentTimeMillis();
> +            System.out.println(Thread.currentThread().getName()+" Request complete:"+(stop-start)+" ms.");
> +            passed = (this.readLine()==null);
> +            // Close the connection
> +            disconnect();
> +            reset();
> +            assertTrue(passed);
> +        }
> +
> +        private void doHttp11Request() throws Exception {
> +            Tomcat tomcat = getTomcatInstance();
> +            init();
> +            tomcat.start();
> +            // Open connection
> +            connect();
> +
> +            // Send request in two parts
> +            String[] request = new String[1];
> +            request[0] =
> +                "GET /test HTTP/1.1" + CRLF +
> +                "Host: localhost" + CRLF +
> +                "Connection: Keep-Alive" + CRLF+
> +                "Keep-Alive: 300"+ CRLF+ CRLF;
> +
> +            setRequest(request);
> +
> +            for (int i=0; i<5; i++) {
> +                processRequest(false); // blocks until response has been read
> +                assertTrue(getResponseLine()!=null && getResponseLine().trim().startsWith("HTTP/1.1 200"));
> +            }
> +            boolean passed = (this.readLine()==null);
> +            // Close the connection
> +            disconnect();
> +            reset();
> +            tomcat.stop();
> +            assertTrue(passed);
> +        }
> +
> +        @Override
> +        public boolean isResponseBodyOK() {
> +            return true;
> +        }
> +
> +    }
> +
> +
> +    private static class SimpleServlet extends HttpServlet {
> +
> +        private static final long serialVersionUID = 1L;
> +
> +        @Override
> +        protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
> +            try {
> +                Thread.sleep(TestMaxConnections.soTimeout/2);
> +            }catch (InterruptedException x) {
> +
> +            }
> +            resp.setContentLength(0);
> +            resp.flushBuffer();
> +        }
> +
> +    }
> +
> +}
>
> Propchange: tomcat/trunk/test/org/apache/catalina/connector/TestMaxConnections.java
> ------------------------------------------------------------------------------
>    svn:eol-style = native
>
> Modified: tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java
> URL: http://svn.apache.org/viewvc/tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java?rev=1051202&r1=1051201&r2=1051202&view=diff
> ==============================================================================
> --- tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java (original)
> +++ tomcat/trunk/test/org/apache/catalina/startup/SimpleHttpClient.java Mon Dec 20 16:42:13 2010
> @@ -25,7 +25,9 @@ import java.io.OutputStream;
>  import java.io.OutputStreamWriter;
>  import java.io.Reader;
>  import java.io.Writer;
> +import java.net.InetSocketAddress;
>  import java.net.Socket;
> +import java.net.SocketAddress;
>  import java.net.UnknownHostException;
>  import java.util.ArrayList;
>  import java.util.List;
> @@ -109,14 +111,20 @@ public abstract class SimpleHttpClient {
>         return null;
>     }
>
> -    public void connect() throws UnknownHostException, IOException {
> -        socket = new Socket("localhost", port);
> +    public void connect(int connectTimeout, int soTimeout) throws UnknownHostException, IOException {
> +        SocketAddress addr = new InetSocketAddress("localhost", port);
> +        socket = new Socket();
> +        socket.setSoTimeout(soTimeout);
> +        socket.connect(addr,connectTimeout);
>         OutputStream os = socket.getOutputStream();
>         writer = new OutputStreamWriter(os);
>         InputStream is = socket.getInputStream();
>         Reader r = new InputStreamReader(is);
>         reader = new BufferedReader(r);
>     }
> +    public void connect() throws UnknownHostException, IOException {
> +        connect(0,0);
> +    }
>
>     public void processRequest() throws IOException, InterruptedException {
>         processRequest(true);
>
> Modified: tomcat/trunk/webapps/docs/config/http.xml
> URL: http://svn.apache.org/viewvc/tomcat/trunk/webapps/docs/config/http.xml?rev=1051202&r1=1051201&r2=1051202&view=diff
> ==============================================================================
> --- tomcat/trunk/webapps/docs/config/http.xml (original)
> +++ tomcat/trunk/webapps/docs/config/http.xml Mon Dec 20 16:42:13 2010
> @@ -361,6 +361,15 @@
>       execute tasks using the executor rather than an internal thread pool.</p>
>     </attribute>
>
> +    <attribute name="maxConnections" required="false">
> +      <p>The maximum number of connections that the server will accept and process
> +      at any given time. When this number has been reached, the server will not accept any more
> +      connections until the number of connections reach below this value. The operating system may still accept connections based
> +      on the <code>acceptCount</code> setting.
> +      This setting is currently only applicable to the blocking Java connectors (AJP/HTTP).
> +      Default value is <code>10000</code>.</p>
> +    </attribute>
> +
>     <attribute name="maxTrailerSize" required="false">
>       <p>Limits the total length of trailing headers in the last chunk of
>       a chunked HTTP request. If the value is <code>-1</code>, no limit will be
>
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
> For additional commands, e-mail: dev-help@tomcat.apache.org
>
>

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@tomcat.apache.org
For additional commands, e-mail: dev-help@tomcat.apache.org