You are viewing a plain text version of this content. The canonical link for it is here.
Posted to xmlrpc-auto@ws.apache.org by jo...@apache.org on 2006/08/21 02:21:57 UTC

svn commit: r433098 - in /webservices/xmlrpc/trunk: common/src/main/java/org/apache/xmlrpc/util/ server/src/main/java/org/apache/xmlrpc/server/ server/src/main/java/org/apache/xmlrpc/webserver/ src/changes/ tests/src/test/java/org/apache/xmlrpc/test/

Author: jochen
Date: Sun Aug 20 17:21:56 2006
New Revision: 433098

URL: http://svn.apache.org/viewvc?rev=433098&view=rev
Log:
The releaseWorker() method wasn't called for the server.
Fixed another bug in the web servers thread pool, which caused that
threads haven't been reused.

Added:
    webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ScalabilityTest.java
Modified:
    webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/util/ThreadPool.java
    webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcServer.java
    webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/WebServer.java
    webservices/xmlrpc/trunk/src/changes/changes.xml

Modified: webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/util/ThreadPool.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/util/ThreadPool.java?rev=433098&r1=433097&r2=433098&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/util/ThreadPool.java (original)
+++ webservices/xmlrpc/trunk/common/src/main/java/org/apache/xmlrpc/util/ThreadPool.java Sun Aug 20 17:21:56 2006
@@ -115,7 +115,7 @@
 	}
 
 	synchronized void repool(MyThread pThread) {
-		if (maxSize != 0  &&  (runningThreads.size() + waitingThreads.size()) <= maxSize) {
+		if (maxSize != 0  &&  (runningThreads.size() + waitingThreads.size()) > maxSize) {
 			discard(pThread);
 		} else if (waitingTasks.size() > 0) {
 			pThread.setTask((Task) waitingTasks.remove(0));
@@ -135,7 +135,7 @@
 	 * might consider to use the {@link #addTask(Task)} method instead.
 	 */
 	public synchronized boolean startTask(Task pTask) {
-		if (maxSize != 0  &&  (runningThreads.size() + waitingThreads.size()) >= maxSize) {
+		if (maxSize != 0  &&  runningThreads.size() > maxSize) {
 			return false;
 		}
 		MyThread t;
@@ -180,4 +180,9 @@
 	 * @return Maximum number of threads.
 	 */
 	public int getMaxThreads() { return maxSize; }
+
+	/** Returns the number of threads, which have actually been created,
+     * as opposed to the number of currently running threads.
+	 */
+    public int getNumThreads() { return num; }
 }

Modified: webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcServer.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcServer.java?rev=433098&r1=433097&r2=433098&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcServer.java (original)
+++ webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/server/XmlRpcServer.java Sun Aug 20 17:21:56 2006
@@ -22,6 +22,7 @@
 import org.apache.xmlrpc.common.TypeConverterFactoryImpl;
 import org.apache.xmlrpc.common.XmlRpcController;
 import org.apache.xmlrpc.common.XmlRpcRequestProcessor;
+import org.apache.xmlrpc.common.XmlRpcWorker;
 import org.apache.xmlrpc.common.XmlRpcWorkerFactory;
 
 
@@ -76,6 +77,12 @@
 	 * @throws XmlRpcException The request failed.
 	 */
 	public Object execute(XmlRpcRequest pRequest) throws XmlRpcException {
-		return getWorkerFactory().getWorker().execute(pRequest);
+	    final XmlRpcWorkerFactory factory = getWorkerFactory();
+	    final XmlRpcWorker worker = factory.getWorker();
+        try {
+            return worker.execute(pRequest);
+        } finally {
+            factory.releaseWorker(worker);
+        }
 	}
 }

Modified: webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/WebServer.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/WebServer.java?rev=433098&r1=433097&r2=433098&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/WebServer.java (original)
+++ webservices/xmlrpc/trunk/server/src/main/java/org/apache/xmlrpc/webserver/WebServer.java Sun Aug 20 17:21:56 2006
@@ -307,7 +307,7 @@
 	 * @see #shutdown()
 	 */
 	public void run() {
-		pool = new ThreadPool(server.getMaxThreads(), "XML-RPC");
+		pool = newThreadPool();
 		try {
 			while (listener != null) {
 				try {
@@ -351,6 +351,10 @@
 			pool.shutdown();
 		}
 	}
+
+    protected ThreadPool newThreadPool() {
+        return new ThreadPool(server.getMaxThreads(), "XML-RPC");
+    }
 	
 	/**
 	 * Stop listening on the server port.  Shutting down our {@link

Modified: webservices/xmlrpc/trunk/src/changes/changes.xml
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/src/changes/changes.xml?rev=433098&r1=433097&r2=433098&view=diff
==============================================================================
--- webservices/xmlrpc/trunk/src/changes/changes.xml (original)
+++ webservices/xmlrpc/trunk/src/changes/changes.xml Sun Aug 20 17:21:56 2006
@@ -36,6 +36,14 @@
         Basic authentication didn't work with the commons http transport,
         if user name or password contained non-ASCII characters.
       </action>
+      <action dev="jochen" type="fix" due-to="Randall Bryant"
+          due-to-email="randall@magpieti.com">
+        The releaseWorker() method wasn't called for the server.
+      </action>
+      <action dev="jochen" type="fix">
+        Fixed a bug in the web servers thread pool, which caused that
+        threads haven't been reused.
+      </action>
     </release>
     <release version="3.0rc1" date="27-Jul-2006">
       <action dev="jochen" type="fix" due-to="Alan Burlison"

Added: webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ScalabilityTest.java
URL: http://svn.apache.org/viewvc/webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ScalabilityTest.java?rev=433098&view=auto
==============================================================================
--- webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ScalabilityTest.java (added)
+++ webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrpc/test/ScalabilityTest.java Sun Aug 20 17:21:56 2006
@@ -0,0 +1,143 @@
+/*
+ * Copyright 2006 The Apache Software Foundation.
+ * 
+ * Licensed 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.xmlrpc.test;
+
+import java.net.URL;
+
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServlet;
+
+import org.apache.xmlrpc.XmlRpcException;
+import org.apache.xmlrpc.client.XmlRpcClient;
+import org.apache.xmlrpc.client.XmlRpcClientConfigImpl;
+import org.apache.xmlrpc.server.PropertyHandlerMapping;
+import org.apache.xmlrpc.server.XmlRpcHandlerMapping;
+import org.apache.xmlrpc.util.ThreadPool;
+import org.apache.xmlrpc.webserver.ServletWebServer;
+import org.apache.xmlrpc.webserver.XmlRpcServlet;
+
+import junit.framework.TestCase;
+
+
+/**
+ * Tests the frameworks scalability.
+ */
+public class ScalabilityTest extends TestCase {
+    /**
+     * Primitive handler class
+     */
+    public static class Adder {
+        /**
+         * Returns the sum of the numbers p1 and p2.
+         */
+        public int add(int p1, int p2) {
+            return p1 + p2;
+        }
+    }
+
+    private class MyServletWebServer extends ServletWebServer {
+        protected ThreadPool pool;
+        MyServletWebServer(HttpServlet pServlet, int pPort)
+                throws ServletException {
+            super(pServlet, pPort);
+        }
+        public ThreadPool newThreadPool(){
+            pool = new ThreadPool(server.getMaxThreads(), "XML-RPC"){
+                
+            };
+            return pool;
+        }
+        int getNumThreads() {
+            return pool.getNumThreads();
+        }
+    }
+
+    private static final int BASE = 1;
+    private static final Integer THREE = new Integer(3);
+    private static final Integer FIVE = new Integer(5);
+    private static final Integer EIGHT = new Integer(8);
+    private XmlRpcServlet servlet;
+    private MyServletWebServer server;
+
+    protected void setUp() throws Exception {
+        servlet = new XmlRpcServlet(){
+            private static final long serialVersionUID = -2040521497373327817L;
+            protected XmlRpcHandlerMapping newXmlRpcHandlerMapping()
+                    throws XmlRpcException {
+                PropertyHandlerMapping mapping = new PropertyHandlerMapping();
+                mapping.addHandler("Adder", Adder.class);
+                return mapping;
+            }
+            
+        };
+        server = new MyServletWebServer(servlet, 0);
+        server.getXmlRpcServer().setMaxThreads(25);
+        server.start();
+    }
+
+    protected void tearDown() {
+        server.shutdown();
+    }
+
+    /**
+     * Runs the test with a single client.
+     */
+    public void testSingleClient() throws Exception {
+        long now = System.currentTimeMillis();
+        servlet.getXmlRpcServletServer().setMaxThreads(1);
+        new Client(100*BASE, server.getPort()).run();
+        System.out.println("Single client: " + (System.currentTimeMillis()-now) + ", " + server.getNumThreads());
+    }
+
+    private static class Client implements Runnable {
+        private final int iterations;
+        private final int port;
+        Client(int pIterations, int pPort) {
+            iterations = pIterations;
+            port = pPort;
+        }
+        public void run() {
+            try {
+                XmlRpcClient client = new XmlRpcClient();
+                XmlRpcClientConfigImpl config = new XmlRpcClientConfigImpl();
+                config.setServerURL(new URL("http://127.0.0.1:" + port + "/"));
+                client.setConfig(config);
+                for (int i = 0;  i < iterations;  i++) {
+                    assertEquals(EIGHT, client.execute("Adder.add", new Object[]{THREE, FIVE}));
+                }
+            } catch (Throwable t) {
+                t.printStackTrace();
+            }
+        }
+    }
+
+    /**
+     * Runs the test with ten clients.
+     */
+    public void testTenClient() throws Exception {
+        final Thread[] threads = new Thread[10];
+        servlet.getXmlRpcServletServer().setMaxThreads(10);
+        long now = System.currentTimeMillis();
+        for (int i = 0;  i < threads.length;  i++) {
+            threads[i] = new Thread(new Client(10*BASE, server.getPort()));
+            threads[i].start();
+        }
+        for (int i = 0;  i < threads.length;  i++) {
+            threads[i].join();
+        }
+        System.out.println("Ten clients: " + (System.currentTimeMillis() - now) + ", " + server.getNumThreads());
+    }
+}