Methods Summary |
---|
public boolean | addPoolListener(PoolListener listener)Add a PoolListener
synchronized (this) {
if (listeners == null) {
listeners = new ArrayList();
listeners.add(listener);
return true;
}
if (listeners.indexOf(listener) == -1) {
listeners.add(listener);
return true;
} else {
return false;
}
}
|
public void | afterCreate(java.lang.Object object)Called after an object is created using factory.create(....)
if (listeners != null) {
int size = listeners.size();
for (int i=0; i<size; i++) {
((PoolListener) listeners.get(i)).afterCreate(object);
}
}
|
public void | afterNotify(java.lang.Object object)Called by the thread that has been notified.
if (listeners != null) {
int size = listeners.size();
for (int i=0; i<size; i++) {
((PoolListener) listeners.get(i)).afterNotify(object);
}
}
|
public void | beforeDestroy(java.lang.Object object)Called before an object is destroyed using factory.destroy(object)
if (listeners != null) {
int size = listeners.size();
for (int i=0; i<size; i++) {
((PoolListener) listeners.get(i)).beforeDestroy(object);
}
}
|
public void | beforeWait(java.lang.Object object)Called by the thread that is about to wait.
if (listeners != null) {
int size = listeners.size();
for (int i=0; i<size; i++) {
((PoolListener) listeners.get(i)).beforeWait(object);
}
}
|
protected abstract boolean | canCreate()
|
protected abstract java.lang.Object | checkin(java.lang.Object object)Notification when an object is put back into the pool (checkin).
|
protected abstract java.lang.Object | checkout(java.lang.Object param)Notification when an object is given out from the pool (checout).
|
public void | close()Closes the current pool. No further getObject(....)s are allowed, while
returnObject() and destroyObjects() are allowed.
//first clean up all objects
onClose();
synchronized (collection) {
closed = "__Closed__";
int diff = collection.size() - this.waitCount;
destroyPoolObjects(diff);
//We do not need to change the factory as all fresh getObject()
// requests are blocked well before the synchronized access to the
// collection (or pool).
//this.factory = new ClosedObjectFactory(this.factory);
}
|
public void | destroyObject(java.lang.Object object)Destroys an Object. Note that applications should not ignore the reference
to the object that they got from getObject(). An object that is obtained through
getObject() must always be returned back to the pool using either
returnObject(obj) or through destroyObject(obj). This method tells that the
object should be destroyed and cannot be reused.
beforeDestroy(object);
factory.destroy(object);
synchronized (collection) {
createdCount--;
if (waitCount > 0) {
collection.notify();
}
}
|
public int | destroyPoolObjects()Destroy the available objects in the pool.
return destroyPoolObjects(collection.size());
|
public int | destroyPoolObjects(int count)Destroy 'count' available objects in the pool.
if (count <= 0) {
return 0;
}
Object[] array = collection.toArray();
ArrayList arrayList = null;
synchronized (collection) {
if (count > collection.size()) {
count = collection.size();
}
arrayList = new ArrayList(count);
for (int i=0; i<count; i++) {
arrayList.add(checkout(null));
}
count = arrayList.size();
createdCount -= count;
}
for (int i=0; i<count; i++) {
factory.destroy(arrayList.get(i));
}
return count;
|
public java.lang.Object | getObject(boolean canWait, java.lang.Object param)Get an object. Application can use pool.getObject() to get an object
instead of using new XXX().
Object object;
if (closed != null) {
throw new PoolException("Pool closed. Cannot obtain object");
}
synchronized (collection) {
while (true) {
if (collection.size() > 0) {
if ( (object = checkout(param)) != null) {
return object;
}
} else if (canCreate()) {
createdCount++;
break;
}
if (canWait) {
try {
waitCount++;
beforeWait(param);
collection.wait();
afterNotify(param);
waitCount--;
} catch (InterruptedException inEx) {
throw new RequestInterruptedException("InterruptedException", inEx);
}
} else {
return null;
}
}
}
try {
object = factory.create(param);
} catch (PoolException poolEx) {
synchronized (collection) {
createdCount--;
}
throw poolEx;
}
afterCreate(object);
return object;
|
public java.lang.Object | getObject(long waitFor, java.lang.Object param)Get an object. Application can use pool.getObject() to get an object
instead of using new XXX(). The method throws TimedoutException
if an object could not be returned in 'waitForMillis' millisecond.
if (closed != null) {
throw new PoolException("Pool closed. Cannot obtain object");
}
long now = _clock.getTime();
long timeLeft = waitFor;
long startTime = now;
Object object;
synchronized (collection) {
while (true) {
if (collection.size() > 0) {
if ( (object = checkout(param)) != null) {
return object;
}
} else if (canCreate()) {
createdCount++;
break;
}
if (timeLeft > 0) {
try {
waitCount++;
beforeWait(param);
collection.wait();
afterNotify(param);
waitCount--;
} catch (InterruptedException inEx) {
throw new RequestInterruptedException("InterruptedException", inEx);
}
} else {
return null;
}
now = _clock.getTime();
timeLeft = now - startTime;
startTime = now;
}
}
try {
object = factory.create(param);
} catch (PoolException poolEx) {
synchronized (collection) {
createdCount--;
}
throw poolEx;
}
afterCreate(object);
return object;
|
public boolean | isClosed()Test if the pool is closed or not
return (closed != null);
|
public void | onClose()Called when the pool is closed.
if (listeners != null) {
int size = listeners.size();
for (int i=0; i<size; i++) {
((PoolListener) listeners.get(i)).onClose();
}
}
|
public void | preload(int count)Preload the pool with objects.
if (count <= 0) {
return;
}
ArrayList tempList = new ArrayList(count);
for (int i=0; i<count; i++) {
try {
tempList.add(factory.create(null));
} catch (PoolException poolEx) {
}
}
count = tempList.size();
synchronized (collection) {
for (int i=0; i<count; i++) {
checkin(tempList.get(i));
}
createdCount += count;
}
//Bug 4677074 if(bDebug) System.out.println("After preload(" + count + "): Size: " + collection.size());
//Bug 4677074 begin
if(com.sun.enterprise.util.logging.Debug.enabled) _logger.log(Level.FINE,"After preload(" + count + "): Size: " + collection.size());
//Bug 4677074 end
|
public boolean | removePoolListener(PoolListener listener)Add a PoolListener
synchronized (this) {
if (listeners == null) {
return false;
} else {
return listeners.remove(listener);
}
}
|
public void | returnObject(java.lang.Object object)Return an object back to the pool. An object that is obtained through
getObject() must always be returned back to the pool using either
returnObject(obj) or through destroyObject(obj).
synchronized (collection) {
if (closed != null) {
if (waitCount == 0) {
destroyObject(object);
return;
}
}
checkin(object);
if (waitCount > 0) {
collection.notify();
}
}
|
public int | size()
return collection.size();
|