All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.apache.xmlrpc.common.XmlRpcWorkerFactory Maven / Gradle / Ivy

There is a newer version: 3.1.3
Show newest version
/*
 * Copyright 1999,2005 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.common;

import java.util.ArrayList;
import java.util.List;


/** A factory for {@link XmlRpcWorker} instances.
 */
public abstract class XmlRpcWorkerFactory {
	private final XmlRpcWorker singleton = newWorker();
	private final XmlRpcController controller;
	private final List pool = new ArrayList();
	private int numThreads;

	/** Creates a new instance.
	 * @param pController The client controlling the factory.
	 */
	public XmlRpcWorkerFactory(XmlRpcController pController) {
		controller = pController;
	}

	/** Creates a new worker instance.
	 * @return New instance of {@link XmlRpcWorker}.
	 */
	protected abstract XmlRpcWorker newWorker();

	/** Returns the factory controller.
	 * @return The controller, an instance of
	 * {@link org.apache.xmlrpc.client.XmlRpcClient}, or
	 * {@link org.apache.xmlrpc.server.XmlRpcServer}.
	 */
	public XmlRpcController getController() {
		return controller;
	}

	/** Returns a worker for synchronous processing.
	 * @return An instance of {@link XmlRpcWorker}, which is ready
	 * for use.
	 * @throws XmlRpcLoadException The clients maximum number of concurrent
	 * threads is exceeded.
	 */
	public synchronized XmlRpcWorker getWorker() throws XmlRpcLoadException {
		int max = controller.getMaxThreads();
		if (max > 0  &&  numThreads == max) {
			throw new XmlRpcLoadException("Maximum number of concurrent requests exceeded: " + max);
		}
		++numThreads;
		if (max == 0) {
			return singleton;
		}
		if (pool.size() == 0) {
			return newWorker();
		} else {
			return (XmlRpcWorker) pool.remove(pool.size() - 1);
		}
	}

	/** Called, when the worker did its job. Frees resources and
	 * decrements the number of concurrent requests.
	 * @param pWorker The worker being released.
	 */
	public synchronized void releaseWorker(XmlRpcWorker pWorker) {
		--numThreads;
		int max = controller.getMaxThreads();
		if (pWorker == singleton) {
			// Do nothing, it's the singleton
		} else {
			if (pool.size() < max) {
				pool.add(pWorker);
			}
		}
	}

	/** Returns the number of currently running requests.
	 * @return Current number of concurrent requests.
	 */
	public synchronized int getCurrentRequests() {
		return numThreads;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy