blob: 194aab8e6600cf65611ab0b1f73483c338229433 [file] [log] [blame]
/*
* 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.uima.collection.impl.cpm.container;
import java.util.Date;
import java.util.LinkedList;
import org.apache.uima.UIMAFramework;
import org.apache.uima.collection.base_cpm.CasProcessor;
import org.apache.uima.collection.impl.cpm.utils.CPMUtils;
import org.apache.uima.util.Level;
/**
* Pool containing and managing instances of CasProcessors. Managed by the container the pool
* facilitates check out and check in of Cas Processors.
*
*
*/
public class ServiceProxyPool {
private LinkedList mAllInstances = new LinkedList();
private LinkedList mFreeInstances = new LinkedList();
// private int mNumInstances;
/**
* Checks out a Resource from the pool.
*
* @return a Resource for use by the client. Returns <code>null</code> if none are available (in
* which case the client may wait on this object in order to be notified when an instance
* becomes available).
*/
public synchronized CasProcessor checkOut() {
if (!mFreeInstances.isEmpty()) {
if (UIMAFramework.getLogger().isLoggable(Level.FINEST)) {
UIMAFramework.getLogger(this.getClass()).logrb(Level.FINEST, this.getClass().getName(),
"process", CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
"UIMA_CPM_checking_out_cp_from_pool__FINEST",
new Object[] { Thread.currentThread().getName() });
}
CasProcessor r = (CasProcessor) mFreeInstances.remove(0);
if (UIMAFramework.getLogger().isLoggable(Level.FINEST)) {
UIMAFramework.getLogger(this.getClass()).logrb(
Level.FINEST,
this.getClass().getName(),
"process",
CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
"UIMA_CPM_show_cp_pool_size__FINEST",
new Object[] { Thread.currentThread().getName(),
String.valueOf(mAllInstances.size()), String.valueOf(mFreeInstances.size()) });
}
return r;
} else {
if (UIMAFramework.getLogger().isLoggable(Level.WARNING)) {
UIMAFramework.getLogger(this.getClass()).logrb(
Level.WARNING,
this.getClass().getName(),
"process",
CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
"UIMA_CPM_cp_pool_empty__WARNING",
new Object[] { Thread.currentThread().getName(),
String.valueOf(mAllInstances.size()), String.valueOf(mFreeInstances.size()) });
}
return null;
}
}
/**
* Checks in a Resource to the pool. Also notifies other Threads that may be waiting for available
* instance.
*
* @param aResource -
* instance of the CasProcessor to check in
*/
public synchronized void checkIn(CasProcessor aResource) {
if (UIMAFramework.getLogger().isLoggable(Level.FINEST)) {
UIMAFramework.getLogger(this.getClass()).logrb(
Level.FINEST,
this.getClass().getName(),
"process",
CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
"UIMA_CPM_checking_in_cp_to_pool__FINEST",
new Object[] { Thread.currentThread().getName(),
String.valueOf(mAllInstances.size()), String.valueOf(mFreeInstances.size()) });
}
// make sure this Resource was actually belongs to this pool and is checked out
if (!mAllInstances.contains(aResource) || mFreeInstances.contains(aResource)) {
if (UIMAFramework.getLogger().isLoggable(Level.FINEST)) {
UIMAFramework.getLogger(this.getClass()).logrb(Level.FINEST, this.getClass().getName(),
"process", CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
"UIMA_CPM_checking_in_invalid_cp_to_pool__FINEST",
new Object[] { Thread.currentThread().getName() });
}
if (!mAllInstances.contains(aResource)) {
if (UIMAFramework.getLogger().isLoggable(Level.FINEST)) {
UIMAFramework.getLogger(this.getClass()).logrb(Level.FINEST, this.getClass().getName(),
"process", CPMUtils.CPM_LOG_RESOURCE_BUNDLE, "UIMA_CPM_cp_not_in_pool__FINEST",
new Object[] { Thread.currentThread().getName() });
}
} else {
if (UIMAFramework.getLogger().isLoggable(Level.FINEST)) {
UIMAFramework.getLogger(this.getClass()).logrb(Level.FINEST, this.getClass().getName(),
"process", CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
"UIMA_CPM_cp_already_checked_in__FINEST",
new Object[] { Thread.currentThread().getName() });
}
}
} else {
// Add the Resource to the end of the free instances List
mFreeInstances.add(aResource);
}
if (UIMAFramework.getLogger().isLoggable(Level.FINEST)) {
UIMAFramework.getLogger(this.getClass()).logrb(
Level.FINEST,
this.getClass().getName(),
"process",
CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
"UIMA_CPM_show_cp_pool_size__FINEST",
new Object[] { Thread.currentThread().getName(),
String.valueOf(mAllInstances.size()), String.valueOf(mFreeInstances.size()) });
}
// Notify any threads waiting on this object
notifyAll();
}
/**
* Checks out a Resource from the pool. If none is currently available, wait for the specified
* amount of time for one to be checked in.
*
* @param aTimeout
* the time to wait in milliseconds. A value of &lt;=0 will wait forever.
*
* @return a Resource for use by the client. Returns <code>null</code> if none are available (in
* which case the client may wait on this object in order to be notified when an instance
* becomes available).
*/
public synchronized CasProcessor checkOut(long aTimeout) {
long startTime = new Date().getTime();
CasProcessor resource;
while ((resource = checkOut()) == null) {
try {
wait(aTimeout);
} catch (InterruptedException e) {
}
if (aTimeout > 0 && (new Date().getTime() - startTime) >= aTimeout) {
// Timeout has expired
return null;
}
}
return resource;
}
/**
* Destroys all Resources in this pool.
*/
public synchronized void destroy() {
mAllInstances.clear();
mFreeInstances.clear();
}
/**
* Gets the available size of this pool (the number of free, available instances at this moment).
*
* @return the available size of this pool
*/
public synchronized int getSize() { // synch for JVM memory model to get current value
return mFreeInstances.size();
}
public synchronized void addCasProcessor(CasProcessor aCasProcessor) {
if (UIMAFramework.getLogger().isLoggable(Level.FINEST)) {
UIMAFramework.getLogger(this.getClass()).logrb(
Level.FINEST,
this.getClass().getName(),
"process",
CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
"UIMA_CPM_add_cp_to_pool__FINEST",
new Object[] { Thread.currentThread().getName(),
aCasProcessor.getProcessingResourceMetaData().getName() });
}
mAllInstances.add(aCasProcessor);
mFreeInstances.add(aCasProcessor);
if (UIMAFramework.getLogger().isLoggable(Level.FINEST)) {
UIMAFramework.getLogger(this.getClass()).logrb(
Level.FINEST,
this.getClass().getName(),
"process",
CPMUtils.CPM_LOG_RESOURCE_BUNDLE,
"UIMA_CPM_show_cp_pool_size__FINEST",
new Object[] { Thread.currentThread().getName(),
String.valueOf(mAllInstances.size()), String.valueOf(mFreeInstances.size()) });
}
}
// /**
// * Utility method used in the constructor to fill the pool with Resource instances.
// *
// * @param aResourceSpecifier
// * specifier that describes how to create the Resource instances for the pool
// * @param aResourceClass
// * class of resource to instantiate
// * @param aResourceInitParams
// * initialization parameters to be passed to the
// * {@link Resource#initialize(ResourceSpecifier,Map)} method.
// *
// *
// * @throws ResourceInitializationException
// * if the Resource instances could not be created
// */
// protected void fillPool(BoundedWorkQueue portQueue, Map initParams)
// throws ResourceInitializationException {
// boolean isServiceLocal = false;
// if (initParams != null && initParams.containsKey("SERVICE_NAME")) {
// isServiceLocal = true;
// }
// // fill the pool
// for (int i = 0; i < mNumInstances; i++) {
// VinciTAP tap = new VinciTAP();
// if (isServiceLocal) {
// String portAsString = (String) portQueue.dequeue();
// int port = -1;
// try {
// port = Integer.parseInt(portAsString);
// } catch (NumberFormatException e) {
// }
// String vnsHost = (String) initParams.get("VNS_HOST");
// String vnsPort = (String) initParams.get("VNS_PORT");
// tap.setVNSHost(vnsHost);
// tap.setVNSPort(vnsPort);
// try {
// tap.connect("127.0.0.1", port);
// } catch (ConnectException e) {
// throw new ResourceInitializationException(e.getMessage(), null);
// }
// }
// mAllInstances.add(tap);
// mFreeInstances.add(tap);
// }
// }
// never used
// /**
// * Returns all instances in the pool
// *
// * @return - list of CasProcessor instances
// */
// protected synchronized LinkedList getAllInstances() {
// return mAllInstances;
// }
//
// /**
// * Returns a list of CasProcessor instances not currently in use
// *
// * @return -list of free proxies
// */
// protected synchronized LinkedList getFreeInstances() {
// return mFreeInstances;
// }
public synchronized int getAllInstanceCount() {
return mAllInstances.size();
}
}