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());
+ }
+}