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/xmlr
pc/test/ScalabilityTest.java
Modified:
webservices/xmlrpc/trunk/common/src/main/java/org/apache/xml
rpc/util/ThreadPool.java
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xml
rpc/server/XmlRpcServer.java
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xml
rpc/webserver/WebServer.java
webservices/xmlrpc/trunk/src/changes/changes.xml
Modified:
webservices/xmlrpc/trunk/common/src/main/java/org/apache/xml
rpc/util/ThreadPool.java
URL: http:/
/svn.apache.org/viewvc/webservices/xmlrpc/trunk/common/src/m
ain/java/org/apache/xmlrpc/util/ThreadPool.java?rev=433098&a
mp;r1=433097&r2=433098&view=diff
============================================================
==================
---
webservices/xmlrpc/trunk/common/src/main/java/org/apache/xml
rpc/util/ThreadPool.java (original)
+++
webservices/xmlrpc/trunk/common/src/main/java/org/apache/xml
rpc/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/xml
rpc/server/XmlRpcServer.java
URL: ht
tp://svn.apache.org/viewvc/webservices/xmlrpc/trunk/server/s
rc/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/xml
rpc/server/XmlRpcServer.java (original)
+++
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xml
rpc/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/xml
rpc/webserver/WebServer.java
URL: ht
tp://svn.apache.org/viewvc/webservices/xmlrpc/trunk/server/s
rc/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/xml
rpc/webserver/WebServer.java (original)
+++
webservices/xmlrpc/trunk/server/src/main/java/org/apache/xml
rpc/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/x
mlrpc/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/xmlr
pc/test/ScalabilityTest.java
URL: http://svn.apache.org/viewvc/w
ebservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlrp
c/test/ScalabilityTest.java?rev=433098&view=auto
============================================================
==================
---
webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlr
pc/test/ScalabilityTest.java (added)
+++
webservices/xmlrpc/trunk/tests/src/test/java/org/apache/xmlr
pc/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(" |