User: starksm
Date: 01/12/28 14:35:14
Modified: src/main/org/jboss/ejb/plugins Tag: Branch_2_4
AbstractInstancePool.java
MessageDrivenInstanceInterceptor.java
StatefulSessionInstanceInterceptor.java
StatelessSessionInstanceInterceptor.java
Log:
Add a strict pooling behavior that limits the number of instances to that
specified by the container-pool-conf/MaximumSize
Revision Changes Path
No revision
No revision
1.9.6.6 +138 -65 jboss/src/main/org/jboss/ejb/plugins/AbstractInstancePool.java
Index: AbstractInstancePool.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/AbstractInstancePool.java,v
retrieving revision 1.9.6.5
retrieving revision 1.9.6.6
diff -u -r1.9.6.5 -r1.9.6.6
--- AbstractInstancePool.java 2001/12/27 19:41:16 1.9.6.5
+++ AbstractInstancePool.java 2001/12/28 22:35:13 1.9.6.6
@@ -17,24 +17,26 @@
import org.jboss.ejb.EnterpriseContext;
import org.w3c.dom.Element;
+
+import EDU.oswego.cs.dl.util.concurrent.FIFOSemaphore;
+
import org.jboss.deployment.DeploymentException;
import org.jboss.metadata.MetaData;
import org.jboss.metadata.XmlLoadable;
import org.jboss.logging.Logger;
/**
- * <review>
* Abstract Instance Pool class containing the basic logic to create
* an EJB Instance Pool.
- * </review>
*
* @see <related>
* @author <a href="mailto:[EMAIL PROTECTED]">Rickard �berg</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Marc Fleury</a>
- * @author <a href="mailto:[EMAIL PROTECTED]">Andreas Schaefer</a>
- * @author <a href="mailto:[EMAIL PROTECTED]">Sacha Labourey</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">Andreas Schaefer</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">Sacha Labourey</a>
+ * @author <a href="mailto:[EMAIL PROTECTED]">Scott Stark/a>
*
- * @version $Revision: 1.9.6.5 $
+ * @version $Revision: 1.9.6.6 $
*
* <p><b>Revisions:</b>
* <p><b>20010704 marcf:</b>
@@ -56,19 +58,26 @@
// Constants -----------------------------------------------------
// Attributes ----------------------------------------------------
+ /** A semaphore that is set when the strict max size behavior is in effect.
+ When set, only maxSize instance may be active and any attempt to get an
+ instance will block until an instance is freed.
+ */
+ private FIFOSemaphore strictMaxSize;
+ /** The time in milliseconds to wait for the strictMaxSize semaphore.
+ */
+ private long strictTimeout = Long.MAX_VALUE;
+ /** The logging interface */
protected Logger log = Logger.getLogger(this.getClass());
-
+ /** The Container the instance pool is associated with */
protected Container container;
-
/** The instance pool stack */
protected Stack pool = new Stack();
/** The maximum number of instances allowed in the pool */
protected int maxSize = 30;
/** determine if we reuse EnterpriseContext objects i.e. if we actually do
pooling */
protected boolean reclaim = false;
-
+ /** The pool seed task set from the feeder-policy config element */
protected InstancePoolFeeder poolFeeder;
- protected boolean useFeeder = false;
// Static --------------------------------------------------------
@@ -103,14 +112,14 @@
public void start()
throws Exception
{
+ if( poolFeeder != null && poolFeeder.isStarted() == false )
+ poolFeeder.start();
}
public void stop()
{
- if (useFeeder && poolFeeder.isStarted())
- {
+ if( poolFeeder != null )
poolFeeder.stop();
- }
}
public void destroy()
@@ -131,59 +140,81 @@
this.reclaim = reclaim;
}
- /**
- * Add a instance in the pool
+ /** Add a instance in the pool by invoking create() with a new
+ bean instance.
+ @exception Exception, thrown on ctx creation failure
*/
public void add()
throws Exception
{
- EnterpriseContext ctx = create(container.createBeanClassInstance());
+ EnterpriseContext ctx = null;
+ try
+ {
+ ctx = create(container.createBeanClassInstance());
+ }
+ catch (InstantiationException e)
+ {
+ throw new ServerException("Could not instantiate bean", e);
+ }
+ catch (IllegalAccessException e)
+ {
+ throw new ServerException("Could not instantiate bean", e);
+ }
if( log.isTraceEnabled() )
log.trace("Add instance "+this+"#"+ctx);
this.pool.push(ctx);
}
- /**
- * Get an instance without identity.
- * Can be used by finders,create-methods, and activation
- *
- * @return Context /w instance
- * @exception RemoteException
- */
- public synchronized EnterpriseContext get()
+ /** Get an instance without identity. Can be used by finders,create-methods,
+ and activation. This method cannot be synchronized since it may block on
+ the strictMaxSize semaphore.
+
+ @return Context with instance
+ @exception RemoteException
+ */
+ public EnterpriseContext get()
throws Exception
{
- if( log.isTraceEnabled() )
+ boolean trace = log.isTraceEnabled();
+ if( trace )
log.trace("Get instance
"+this+"#"+pool.empty()+"#"+getContainer().getBeanClass());
+ if( strictMaxSize != null )
+ {
+ // Block until an instance is available
+ boolean acquired = strictMaxSize.attempt(strictTimeout);
+ if( trace )
+ log.trace("Acquired("+acquired+") strictMaxSize semaphore,
remaining="+strictMaxSize.permits());
+ if( acquired == false )
+ throw new ServerException("Failed to acquire the pool semaphore,
strictTimeout="+strictTimeout);
+ }
+ EnterpriseContext ctx = internalGet();
+ return ctx;
+ }
+
+ /** Called by the public get() method with the strictMaxSize has been acquired
+ if strictMaxSize is being used. This method obtains a ctx from the
+ pool if it is not empty, else a new ctx is created by calling add().
+ */
+ private synchronized EnterpriseContext internalGet()
+ throws Exception
+ {
EnterpriseContext ctx = null;
- if (!pool.empty())
+ if( pool.empty() == false )
{
+ // Take the next available instance
ctx = (EnterpriseContext) pool.pop();
}
- // The Pool feeder should avoid this
else
{
- if(useFeeder && poolFeeder.isStarted() && log.isDebugEnabled())
+ // Create an instance
+ if(poolFeeder != null && poolFeeder.isStarted() && log.isDebugEnabled())
{
log.debug("The Pool for " + container.getBeanClass().getName()
+ " has been overloaded. You should change pool parameters.");
- }
-
- try
- {
- if (useFeeder && ! poolFeeder.isStarted())
- poolFeeder.start();
- ctx = create(container.createBeanClassInstance());
- }
- catch (InstantiationException e)
- {
- throw new ServerException("Could not instantiate bean", e);
}
- catch (IllegalAccessException e)
- {
- throw new ServerException("Could not instantiate bean", e);
- }
+ add();
+ ctx = (EnterpriseContext) pool.pop();
}
return ctx;
@@ -198,45 +229,66 @@
*
* @param ctx
*/
- public synchronized void free(EnterpriseContext ctx)
+ public void free(EnterpriseContext ctx)
{
if( log.isTraceEnabled() )
{
- String msg = maxSize+" Free instance:"+this+"#"+ctx.getId()
+ String msg = "Free instance:"+this+"#"+ctx
+"#"+ctx.getTransaction()
+"#"+reclaim
+"#"+getContainer().getBeanClass();
log.trace(msg);
}
- ctx.clear();
+ // If we block when maxSize instances are in use, invoke release on
strictMaxSize
+ if( strictMaxSize != null )
+ strictMaxSize.release();
+ internalFree(ctx);
+ }
- if( this.reclaim && pool.size() < maxSize )
+ private synchronized void internalFree(EnterpriseContext ctx)
+ {
+ ctx.clear();
+ try
{
- // Add the unused context back into the pool
- try
+ if( this.reclaim && pool.size() < maxSize )
{
+ // If we pool instances return the ctx to the pool stack
pool.push(ctx);
}
- catch (Exception ignored)
+ else
{
+ // Discard the context
+ ctx.discard();
}
}
- else
+ catch (Exception e)
{
- // Discard the context
- discard(ctx);
+ log.debug("free failure", e);
}
}
public void discard(EnterpriseContext ctx)
{
+ if( log.isTraceEnabled() )
+ {
+ String msg = "Discard instance:"+this+"#"+ctx
+ +"#"+ctx.getTransaction()
+ +"#"+reclaim
+ +"#"+getContainer().getBeanClass();
+ log.trace(msg);
+ }
+
+ // If we block when maxSize instances are in use, invoke release on
strictMaxSize
+ if( strictMaxSize != null )
+ strictMaxSize.release();
+
// Throw away, unsetContext()
try
{
ctx.discard();
- } catch (RemoteException e)
+ }
+ catch (RemoteException e)
{
- // DEBUG Logger.exception(e);
}
}
@@ -256,20 +308,39 @@
*/
public void importXml(Element element) throws DeploymentException
{
- String maximumSize =
MetaData.getElementContent(MetaData.getUniqueChild(element, "MaximumSize"));
+ // Get the maximum capacity of the pool
+ String maximumSize =
MetaData.getElementContent(MetaData.getOptionalChild(element, "MaximumSize"));
try
{
- this.maxSize = Integer.parseInt(maximumSize);
+ if( maximumSize != null )
+ this.maxSize = Integer.parseInt(maximumSize);
}
catch (NumberFormatException e)
{
throw new DeploymentException("Invalid MaximumSize value for instance pool
configuration");
}
+ // Get whether the pool will block when MaximumSize instances are active
+ String strictValue =
MetaData.getElementContent(MetaData.getOptionalChild(element, "strictMaximumSize"));
+ Boolean strictFlag = Boolean.valueOf(strictValue);
+ if( strictFlag == Boolean.TRUE )
+ this.strictMaxSize = new FIFOSemaphore(this.maxSize);
+ String delay = MetaData.getElementContent(MetaData.getOptionalChild(element,
"strictTimeout"));
+ try
+ {
+ if( delay != null )
+ this.strictTimeout = Integer.parseInt(delay);
+ }
+ catch (NumberFormatException e)
+ {
+ throw new DeploymentException("Invalid strictTimeout value for instance
pool configuration");
+ }
+
+ // Get the pool feeder task
String feederPolicy =
MetaData.getElementContent(MetaData.getOptionalChild(element, "feeder-policy"));
+ poolFeeder = null;
if (feederPolicy != null)
{
- useFeeder = true;
try
{
Class cls =
Thread.currentThread().getContextClassLoader().loadClass(feederPolicy);
@@ -283,10 +354,7 @@
throw new DeploymentException("Can't create instance pool feeder", x);
}
}
- else
- {
- useFeeder = false;
- }
+ log.debug("config - MaximumSize="+maxSize+",
strictMaximumSize="+strictFlag+", feederPolicy="+feederPolicy);
}
// Package protected ---------------------------------------------
@@ -305,14 +373,19 @@
Iterator i = this.pool.iterator();
while (i.hasNext())
{
- EnterpriseContext ec = (EnterpriseContext)i.next();
+ EnterpriseContext ctx = (EnterpriseContext)i.next();
// Clear TX so that still TX entity pools get killed as well
- ec.clear();
- discard(ec);
+ ctx.clear();
+ try
+ {
+ ctx.discard();
+ }
+ catch (RemoteException e)
+ {
+ }
}
}
// Inner classes -------------------------------------------------
}
-
1.3.6.2 +15 -9
jboss/src/main/org/jboss/ejb/plugins/MessageDrivenInstanceInterceptor.java
Index: MessageDrivenInstanceInterceptor.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/MessageDrivenInstanceInterceptor.java,v
retrieving revision 1.3.6.1
retrieving revision 1.3.6.2
diff -u -r1.3.6.1 -r1.3.6.2
--- MessageDrivenInstanceInterceptor.java 2001/12/14 03:22:10 1.3.6.1
+++ MessageDrivenInstanceInterceptor.java 2001/12/28 22:35:13 1.3.6.2
@@ -10,18 +10,19 @@
import java.util.Map;
import org.jboss.ejb.Container;
+import org.jboss.ejb.EnterpriseContext;
+import org.jboss.ejb.InstancePool;
import org.jboss.ejb.MessageDrivenContainer;
import org.jboss.ejb.MethodInvocation;
/**
- * This container acquires the given instance. This must be used after
- * the EnvironmentInterceptor, since acquiring instances requires a proper
- * JNDI environment to be set.
+ * This container acquires an MDB instance and context.
*
* @author <a href="mailto:[EMAIL PROTECTED]">Peter Antman</a>.
* @author <a href="mailto:[EMAIL PROTECTED]">Rickard �berg</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Jason Dillon</a>
- * @version $Revision: 1.3.6.1 $
+ * @author <a href="mailto:[EMAIL PROTECTED]">Scott Stark</a>
+ * @version $Revision: 1.3.6.2 $
*/
public class MessageDrivenInstanceInterceptor
extends AbstractInterceptor
@@ -68,11 +69,12 @@
throws Exception
{
// Get context
- mi.setEnterpriseContext(container.getInstancePool().get());
+ InstancePool pool = container.getInstancePool();
+ EnterpriseContext ctx = pool.get();
+ mi.setEnterpriseContext(ctx);
// There is no need for synchronization since the instance is always
// fresh also there should never be a tx associated with the instance.
-
try
{
// Invoke through interceptors
@@ -80,20 +82,24 @@
} catch (RuntimeException e) // Instance will be GC'ed at MI return
{
mi.setEnterpriseContext(null);
+ pool.discard(ctx);
throw e;
} catch (RemoteException e) // Instance will be GC'ed at MI return
{
mi.setEnterpriseContext(null);
+ pool.discard(ctx);
throw e;
} catch (Error e) // Instance will be GC'ed at MI return
{
mi.setEnterpriseContext(null);
+ pool.discard(ctx);
throw e;
} finally
{
- // Return context
- if (mi.getEnterpriseContext() != null)
- container.getInstancePool().free(mi.getEnterpriseContext());
+ // Return context, when can this be null?
+ ctx = mi.getEnterpriseContext();
+ if( ctx != null )
+ pool.free(ctx);
}
}
// Monitorable implementation ------------------------------------
1.15.6.2 +76 -67
jboss/src/main/org/jboss/ejb/plugins/StatefulSessionInstanceInterceptor.java
Index: StatefulSessionInstanceInterceptor.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/StatefulSessionInstanceInterceptor.java,v
retrieving revision 1.15.6.1
retrieving revision 1.15.6.2
diff -u -r1.15.6.1 -r1.15.6.2
--- StatefulSessionInstanceInterceptor.java 2001/09/04 01:51:07 1.15.6.1
+++ StatefulSessionInstanceInterceptor.java 2001/12/28 22:35:13 1.15.6.2
@@ -37,7 +37,8 @@
* @author <a href="mailto:[EMAIL PROTECTED]">Rickard �berg</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Marc Fleury</a>
* @author <a href="mailto:[EMAIL PROTECTED]">Bill Burke</a>
- * @version $Revision: 1.15.6.1 $
+ * @author <a href="mailto:[EMAIL PROTECTED]">Scott Stark</a>
+ * @version $Revision: 1.15.6.2 $
*
* <p><b>Revisions:</b>
* <p><b>20010704 marcf</b>
@@ -55,12 +56,8 @@
// Constants ----------------------------------------------------
// Attributes ---------------------------------------------------
-
- /** Instance logger. */
- protected Category log = Category.getInstance(this.getClass());
-
protected StatefulSessionContainer container;
-
+
// Static -------------------------------------------------------
private static Method getEJBHome;
@@ -80,8 +77,10 @@
isIdentical = EJBObject.class.getMethod("isIdentical", new Class[]
{EJBObject.class});
remove = EJBObject.class.getMethod("remove", noArg);
}
- catch (Exception e) {
- e.printStackTrace();
+ catch (Exception e)
+ {
+ Category tmp =
Category.getInstance(StatefulSessionInstanceInterceptor.class);
+ tmp.error("Static setup failed", e);
throw new ExceptionInInitializerError(e);
}
}
@@ -94,63 +93,62 @@
{
this.container = (StatefulSessionContainer)container;
}
-
+
public Container getContainer()
{
return container;
}
-
+
// Interceptor implementation -----------------------------------
public Object invokeHome(MethodInvocation mi)
throws Exception
- {
- // Get context
-
+ {
// get a new context from the pool (this is a home method call)
- EnterpriseContext ctx = container.getInstancePool().get();
-
-
+ InstancePool pool = container.getInstancePool();
+ EnterpriseContext ctx = pool.get();
+
// set the context on the methodInvocation
mi.setEnterpriseContext(ctx);
-
+
// It is a new context for sure so we can lock it
ctx.lock();
-
try
{
// Invoke through interceptors
return getNext().invokeHome(mi);
- } finally
+ }
+ finally
{
synchronized (ctx)
{
// Release the lock
ctx.unlock();
-
+
// Still free? Not free if create() was called successfully
if (ctx.getId() == null)
{
- container.getInstancePool().free(ctx);
+ pool.free(ctx);
}
}
}
}
-
+
private void register(EnterpriseContext ctx, Transaction tx, BeanLock lock)
{
// Create a new synchronization
InstanceSynchronization synch = new InstanceSynchronization(tx, ctx, lock);
- try {
+ try
+ {
// OSH: An extra check to avoid warning.
// Can go when we are sure that we no longer get
// the JTA violation warning.
- if (tx.getStatus() == Status.STATUS_MARKED_ROLLBACK) {
-
+ if (tx.getStatus() == Status.STATUS_MARKED_ROLLBACK)
+ {
return;
}
-
+
// We want to be notified when the transaction commits
try
{
@@ -166,38 +164,39 @@
// EJB 1.1, 6.5.3
synch.afterBegin();
-
- } catch (RollbackException e) {
-
- } catch (Exception e) {
-
+ }
+ catch (RollbackException e)
+ {
+ log.debug("register failure", e);
+ }
+ catch (Exception e)
+ {
throw new EJBException(e);
-
}
}
-
+
public Object invoke(MethodInvocation mi)
throws Exception
{
- AbstractInstanceCache cache =
- (AbstractInstanceCache)container.getInstanceCache();
- Object id = mi.getId();
+ InstanceCache cache = container.getInstanceCache();
+ InstancePool pool = container.getInstancePool();
+ Object methodID = mi.getId();
EnterpriseContext ctx = null;
- BeanLock lock = (BeanLock)container.getLockManager().getLock(id);
+ BeanLock lock = (BeanLock)container.getLockManager().getLock(methodID);
try
{
lock.sync(); // synchronized(ctx)
try // lock.sync
{
// Get context
- ctx = container.getInstanceCache().get(mi.getId());
+ ctx = cache.get(methodID);
// Associate it with the method invocation
mi.setEnterpriseContext(ctx);
// BMT beans will lock and replace tx no matter what, CMT do work on
transaction
- if (!((SessionMetaData)container.getBeanMetaData()).isBeanManagedTx()) {
-
+ if (!((SessionMetaData)container.getBeanMetaData()).isBeanManagedTx())
+ {
// Do we have a running transaction with the context
if (ctx.getTransaction() != null &&
// And are we trying to enter with another transaction
@@ -206,16 +205,16 @@
// Calls must be in the same transaction
throw new RemoteException("Application Error: tried to enter
Stateful bean with different transaction context");
}
-
+
//If the instance will participate in a new transaction we register
a sync for it
- if (ctx.getTransaction() == null && mi.getTransaction() != null) {
+ if (ctx.getTransaction() == null && mi.getTransaction() != null)
+ {
register(ctx, mi.getTransaction(), lock);
}
}
-
+
if (!ctx.isLocked())
{
-
//take it!
ctx.lock();
}
@@ -244,23 +243,26 @@
} catch (RemoteException e)
{
// Discard instance
- container.getInstanceCache().remove(mi.getId());
+ cache.remove(methodID);
+ pool.discard(ctx);
ctx = null;
throw e;
} catch (RuntimeException e)
{
// Discard instance
- container.getInstanceCache().remove(mi.getId());
+ cache.remove(methodID);
+ pool.discard(ctx);
ctx = null;
throw e;
} catch (Error e)
{
// Discard instance
- container.getInstanceCache().remove(mi.getId());
+ cache.remove(methodID);
+ pool.discard(ctx);
ctx = null;
-
+
throw e;
} finally
{
@@ -270,7 +272,6 @@
lock.sync(); // synchronized(ctx)
try
{
-
// release it
ctx.unlock();
@@ -278,7 +279,8 @@
if (ctx.getId() == null)
{
// Remove from cache
- container.getInstanceCache().remove(mi.getId());
+ cache.remove(methodID);
+ pool.free(ctx);
}
}
finally
@@ -293,7 +295,7 @@
container.getLockManager().removeLockRef(lock.getId());
}
}
-
+
private boolean isCallAllowed(MethodInvocation mi)
{
Method m = mi.getMethod();
@@ -345,8 +347,10 @@
// Let's compute it now, to speed things up we could
notifySession = (ctx.getInstance() instanceof
javax.ejb.SessionSynchronization);
- if (notifySession) {
- try {
+ if (notifySession)
+ {
+ try
+ {
// Get the class we are working on
Class sync = Class.forName("javax.ejb.SessionSynchronization");
@@ -355,7 +359,8 @@
beforeCompletion = sync.getMethod("beforeCompletion", new Class[0]);
afterCompletion = sync.getMethod("afterCompletion", new Class[]
{boolean.class});
}
- catch (Exception e) {
+ catch (Exception e)
+ {
log.error("failed to setup InstanceSynchronization", e);
}
}
@@ -385,17 +390,19 @@
// lock the context the transaction is being commited (no need for sync)
ctx.lock();
- if (notifySession) {
- try {
-
+ if (notifySession)
+ {
+ try
+ {
beforeCompletion.invoke(ctx.getInstance(), new Object[0]);
}
- catch (Exception e) {
+ catch (Exception e)
+ {
log.error("failed to invoke beforeCompletion", e);
}
}
}
-
+
public void afterCompletion(int status)
{
// DEBUG log.debug("afterCompletion called");
@@ -409,20 +416,23 @@
// unlock this context
ctx.unlock();
- if (notifySession) {
-
- try {
-
- if (status == Status.STATUS_COMMITTED) {
+ if (notifySession)
+ {
+ try
+ {
+ if (status == Status.STATUS_COMMITTED)
+ {
afterCompletion.invoke(ctx.getInstance(),
new Object[] { Boolean.TRUE });
}
- else {
+ else
+ {
afterCompletion.invoke(ctx.getInstance(),
new Object[] { Boolean.FALSE });
}
}
- catch (Exception e) {
+ catch (Exception e)
+ {
log.error("failed to invoke afterCompletion", e);
}
}
@@ -435,4 +445,3 @@
}
}
}
-
1.6.6.2 +40 -33
jboss/src/main/org/jboss/ejb/plugins/StatelessSessionInstanceInterceptor.java
Index: StatelessSessionInstanceInterceptor.java
===================================================================
RCS file:
/cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/StatelessSessionInstanceInterceptor.java,v
retrieving revision 1.6.6.1
retrieving revision 1.6.6.2
diff -u -r1.6.6.1 -r1.6.6.2
--- StatelessSessionInstanceInterceptor.java 2001/10/20 22:13:22 1.6.6.1
+++ StatelessSessionInstanceInterceptor.java 2001/12/28 22:35:14 1.6.6.2
@@ -31,73 +31,80 @@
* the EnvironmentInterceptor, since acquiring instances requires a proper
* JNDI environment to be set
*
- * @see <related>
* @author Rickard �berg ([EMAIL PROTECTED])
- * @version $Revision: 1.6.6.1 $
+ * @author [EMAIL PROTECTED]
+ * @version $Revision: 1.6.6.2 $
*/
public class StatelessSessionInstanceInterceptor
extends AbstractInterceptor
{
// Constants -----------------------------------------------------
-
+
// Attributes ----------------------------------------------------
- protected StatelessSessionContainer container;
+ protected StatelessSessionContainer container;
// Static --------------------------------------------------------
-
+
// Constructors --------------------------------------------------
// Public --------------------------------------------------------
- public void setContainer(Container container)
- {
- this.container = (StatelessSessionContainer)container;
+ public void setContainer(Container container)
+ {
+ this.container = (StatelessSessionContainer)container;
}
-
+
public Container getContainer()
{
- return container;
+ return container;
}
-
+
// Interceptor implementation --------------------------------------
public Object invokeHome(MethodInvocation mi)
throws Exception
{
- // We don't need an instance since the call will be handled by container
+ // We don't need an instance since the call will be handled by container
return getNext().invokeHome(mi);
}
-
+
public Object invoke(MethodInvocation mi)
throws Exception
{
// Get context
- mi.setEnterpriseContext(container.getInstancePool().get());
-
- // There is no need for synchronization since the instance is always fresh
also there should
- // never be a tx associated with the instance.
-
+ InstancePool pool = container.getInstancePool();
+ EnterpriseContext ctx = pool.get();
+ mi.setEnterpriseContext(ctx);
+
+ // There is no need for synchronization since the instance is always fresh
also there should
+ // never be a tx associated with the instance.
try
{
// Invoke through interceptors
return getNext().invoke(mi);
- } catch (RuntimeException e) // Instance will be GC'ed at MI return
+ }
+ catch (RuntimeException e) // Instance will be GC'ed at MI return
{
- mi.setEnterpriseContext(null);
- throw e;
- } catch (RemoteException e) // Instance will be GC'ed at MI return
+ mi.setEnterpriseContext(null);
+ pool.discard(ctx);
+ throw e;
+ }
+ catch (RemoteException e) // Instance will be GC'ed at MI return
{
- mi.setEnterpriseContext(null);
- throw e;
- } catch (Error e) // Instance will be GC'ed at MI return
+ mi.setEnterpriseContext(null);
+ pool.discard(ctx);
+ throw e;
+ }
+ catch (Error e) // Instance will be GC'ed at MI return
{
- mi.setEnterpriseContext(null);
- throw e;
- } finally
+ mi.setEnterpriseContext(null);
+ pool.discard(ctx);
+ throw e;
+ }
+ finally
{
- // Return context
- if (mi.getEnterpriseContext() != null)
- container.getInstancePool().free(mi.getEnterpriseContext());
+ // Return context, when can this be null?
+ ctx = mi.getEnterpriseContext();
+ if( ctx != null )
+ pool.free(ctx);
}
}
-
}
-
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development