A little more than 3 weeks ago, I was asked to rewrite a Multi-threading component that *pooled* connections to Mainframe HTTP Gateway. There was an existing implementation with synchronized array of connections which was initialization with a configurable size. The problem was this implementation was home grown way back in history, and the confidence level in that code was very low. Especially because its going into a JEE container and code-managed threads were not scaling atone to the container.
My first instinct was to use Apache Commons pooling. For one, this would have been much more QA-ed than what I would have implemented. The primary logic would be approximately the same, create-pool > borrow-object > return object. Everything could be done with commons pooling, using the GenericObjectPool.
On a finer level, I need to manage the life of the objects themselves - make sure the encapsulated connection is not stale etc, in which case invalidate it
A sample example (as in JavaDoc)
The Default Implementation would block the borrowObject() call for requests indefinitely. To make this more scalable, I would setMaxWait() to a positive millisecs and handle the NoSuchElementException.
PS. I never completed this implementation due to lack to time at work and other production emergencies hogging my time. I would not have written this post, but Now that I am going to take up a new position at a new client soon. So the eventual implementation of this would be done by someone else at my current client. This post is dedicated to my own procrastination and to suggest my idea to him/her
My first instinct was to use Apache Commons pooling. For one, this would have been much more QA-ed than what I would have implemented. The primary logic would be approximately the same, create-pool > borrow-object > return object. Everything could be done with commons pooling, using the GenericObjectPool.
On a finer level, I need to manage the life of the objects themselves - make sure the encapsulated connection is not stale etc, in which case invalidate it
A sample example (as in JavaDoc)
Object obj = null;
try {
// The only Guarentee is an object will not
// be given to different threads
obj = pool.borrowObject();
// Loop here until you an UNSTALE connection
//...use the object...
} catch(Exception e) {
// if any other invalidate the object
pool.invalidateObject(obj);
// do not return the object to the pool twice
obj = null;
} finally {
// make sure the object is returned to the pool
if(null != obj) {
pool.returnObject(obj);
}
}
The Default Implementation would block the borrowObject() call for requests indefinitely. To make this more scalable, I would setMaxWait() to a positive millisecs and handle the NoSuchElementException.
PS. I never completed this implementation due to lack to time at work and other production emergencies hogging my time. I would not have written this post, but Now that I am going to take up a new position at a new client soon. So the eventual implementation of this would be done by someone else at my current client. This post is dedicated to my own procrastination and to suggest my idea to him/her