User: starksm Date: 01/11/26 20:23:16 Modified: src/main/org/jboss/ejb/plugins AbstractInstanceCache.java Log: Change AbstractInstanceCache to use a single passivator thread for all deployed EJBs as a thread per container is wasteful and kills large deployments on systems with weak VM thread implementations. Revision Changes Path 1.24 +54 -116 jboss/src/main/org/jboss/ejb/plugins/AbstractInstanceCache.java Index: AbstractInstanceCache.java =================================================================== RCS file: /cvsroot/jboss/jboss/src/main/org/jboss/ejb/plugins/AbstractInstanceCache.java,v retrieving revision 1.23 retrieving revision 1.24 diff -u -r1.23 -r1.24 --- AbstractInstanceCache.java 2001/11/26 03:12:25 1.23 +++ AbstractInstanceCache.java 2001/11/27 04:23:16 1.24 @@ -61,7 +61,7 @@ * @author <a href="[EMAIL PROTECTED]">Bill Burke</a> * @author <a href="[EMAIL PROTECTED]">Marc Fleury</a> * - * @version $Revision: 1.23 $ + * @version $Revision: 1.24 $ * * <p><b>Revisions:</b> * @@ -91,11 +91,19 @@ // Constants ----------------------------------------------------- // Attributes ---------------------------------------------------- + /* The worker queue that passivates beans in another thread. One passivator + is shared for all EJB deployments. + */ + static private WorkerQueue m_passivator = new WorkerQueue("EJB Passivator Thread", true); + static + { + // Start the passivator thread + m_passivator.start(); + } protected static Logger log = Logger.getLogger(AbstractInstanceCache.class); + /* The object that is delegated to implement the desired caching policy */ private CachePolicy m_cache; - /* The worker queue that passivates beans in another thread */ - private WorkerQueue m_passivator; /* The mutex object for the cache */ private Object m_cacheLock = new Object(); /* Helper class that handles synchronization for the passivation thread */ @@ -334,8 +342,6 @@ getCache().init(); m_passivationHelper = new PassivationHelper(); String threadName = "Passivator Thread for " + getContainer().getBeanMetaData().getEjbName(); - ClassLoader cl = getContainer().getClassLoader(); - m_passivator = new PassivatorQueue(threadName, cl); if (isJMSMonitoringEnabled()) { @@ -356,7 +362,6 @@ public void start() throws Exception { getCache().start(); - m_passivator.start(); if (isJMSMonitoringEnabled()) { @@ -372,7 +377,6 @@ getCache().stop(); } - if (m_passivator != null) {m_passivator.stop();} if (isJMSMonitoringEnabled() && m_jmsConnection != null) { @@ -424,12 +428,15 @@ protected void logActivation(Object id) { - m_buffer.setLength(0); - m_buffer.append("Activated bean "); - m_buffer.append(getContainer().getBeanMetaData().getEjbName()); - m_buffer.append(" with id = "); - m_buffer.append(id); - log.debug(m_buffer.toString()); + if( log.isTraceEnabled() ) + { + m_buffer.setLength(0); + m_buffer.append("Activated bean "); + m_buffer.append(getContainer().getBeanMetaData().getEjbName()); + m_buffer.append(" with id = "); + m_buffer.append(id); + log.trace(m_buffer.toString()); + } if (isJMSMonitoringEnabled()) { @@ -451,12 +458,15 @@ protected void logPassivationScheduled(Object id) { - m_buffer.setLength(0); - m_buffer.append("Scheduled passivation of bean "); - m_buffer.append(getContainer().getBeanMetaData().getEjbName()); - m_buffer.append(" with id = "); - m_buffer.append(id); - log.debug(m_buffer.toString()); + if( log.isTraceEnabled() ) + { + m_buffer.setLength(0); + m_buffer.append("Scheduled passivation of bean "); + m_buffer.append(getContainer().getBeanMetaData().getEjbName()); + m_buffer.append(" with id = "); + m_buffer.append(id); + log.trace(m_buffer.toString()); + } if (isJMSMonitoringEnabled()) { @@ -479,12 +489,16 @@ protected void logPassivation(Object id) { - m_buffer.setLength(0); - m_buffer.append("Passivated bean "); - m_buffer.append(getContainer().getBeanMetaData().getEjbName()); - m_buffer.append(" with id = "); - m_buffer.append(id); - log.debug(m_buffer.toString()); + if( log.isTraceEnabled() ) + { + m_buffer.setLength(0); + m_buffer.append("Passivated bean "); + m_buffer.append(getContainer().getBeanMetaData().getEjbName()); + m_buffer.append(" with id = "); + m_buffer.append(id); + log.trace(m_buffer.toString()); + } + if (isJMSMonitoringEnabled()) { @@ -507,12 +521,15 @@ protected void logPassivationPostponed(Object id) { - m_buffer.setLength(0); - m_buffer.append("Postponed passivation of bean "); - m_buffer.append(getContainer().getBeanMetaData().getEjbName()); - m_buffer.append(" with id = "); - m_buffer.append(id); - log.debug(m_buffer.toString()); + if( log.isTraceEnabled() ) + { + m_buffer.setLength(0); + m_buffer.append("Postponed passivation of bean "); + m_buffer.append(getContainer().getBeanMetaData().getEjbName()); + m_buffer.append(" with id = "); + m_buffer.append(id); + log.trace(m_buffer.toString()); + } if (isJMSMonitoringEnabled()) { @@ -643,8 +660,11 @@ */ BeanLock lock = getContainer().getLockManager().getLock(id); lock.sync(); - try { - + ClassLoader cl = Thread.currentThread().getContextClassLoader(); + ClassLoader beanCL = getContainer().getClassLoader(); + try + { + Thread.currentThread().setContextClassLoader(beanCL); // marcf: the mutex is not good as we need a thread reentrant one, for now we // use straight synchronization on the ctx as there is a one-one relationship // Also the ctx are not reused any longer so no chance of using the wrong ctx @@ -725,6 +745,7 @@ }//synchronized(ctx) finally { + Thread.currentThread().setContextClassLoader(cl); lock.releaseSync(); getContainer().getLockManager().removeLockRef(id); } @@ -863,86 +884,3 @@ } } -class PassivatorQueue extends WorkerQueue -{ - protected static Logger log = Logger.getLogger(PassivatorQueue.class); - /** - * Used for debug purposes, holds the scheduled passivation jobs - */ - // private Map m_map = new HashMap(); - - /** - * Creates a new passivator queue with default thread name of - * "Passivator Thread". - */ - PassivatorQueue() - { - this("Passivator Thread", null); - } - /** - * Creates a new passivator queue with the given thread name and given - * context class loader. <br> - * @param threadName the name of the passivator thread - * @param cl the context class loader; if null the context class loader is not set. - */ - PassivatorQueue(String threadName, ClassLoader cl) - { - super(threadName); - if (cl != null) - { - m_queueThread.setContextClassLoader(cl); - } - } - /** - * Overridden for debug purposes - *//* - protected Executable getJobImpl() throws InterruptedException - { - PassivationJob j = (PassivationJob)super.getJobImpl(); - EnterpriseContext ctx = j.getEnterpriseContext(); - Object id = ctx.getId(); - m_map.remove(id); - return j; - } - */ - /** - * Overridden for debug purposes - *//* - protected void putJobImpl(Executable job) - { - PassivationJob j = (PassivationJob)job; - EnterpriseContext ctx = j.getEnterpriseContext(); - Object id = ctx.getId(); - if (m_map.get(id) != null) - { - // Here is a bug, job requests are scheduled only once per bean. - System.err.println("DUPLICATE PASSIVATION JOB INSERTION FOR ID = " + ctx.getId()); - System.err.println("CTX isLocked: " + ctx.isLocked()); - System.err.println("CTX transaction: " + ctx.getTransaction()); - throw new IllegalStateException(); - } - else - { - m_map.put(id, job); - } - super.putJobImpl(job); - } - */ - /** - * Logs exceptions thrown during job execution. - */ - protected void logJobException(Exception x) - { - // Log system exceptions - if (x instanceof EJBException) - { - Exception nestedX = ((EJBException)x).getCausedByException(); - if (nestedX != null) - { - log.error("BEAN EXCEPTION", x); - } - } else { - log.error("EXCEPTION", x); - } - } -}
_______________________________________________ Jboss-development mailing list [EMAIL PROTECTED] https://lists.sourceforge.net/lists/listinfo/jboss-development