Author: rmannibucau
Date: Thu Sep 13 23:22:45 2012
New Revision: 1384598

URL: http://svn.apache.org/viewvc?rev=1384598&view=rev
Log:
TOMEE-415 shutting down quartz thread pool + using OpenEJB classloader to 
create schedulers to avoid mem leaks

Modified:
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/DefaultTimerThreadPoolAdapter.java
    
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/DefaultTimerThreadPoolAdapter.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/DefaultTimerThreadPoolAdapter.java?rev=1384598&r1=1384597&r2=1384598&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/DefaultTimerThreadPoolAdapter.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/DefaultTimerThreadPoolAdapter.java
 Thu Sep 13 23:22:45 2012
@@ -38,6 +38,7 @@ public class DefaultTimerThreadPoolAdapt
     private static final Logger logger = Logger.getInstance(LogCategory.TIMER, 
"org.apache.openejb.util.resources");
 
     public static final String OPENEJB_TIMER_POOL_SIZE = 
"openejb.timer.pool.size";
+    public static final String OPENEJB_EJB_TIMER_POOL_AWAIT_SECONDS = 
"openejb.ejb-timer-pool.shutdown.timeout";
 
     private Executor executor;
 
@@ -161,8 +162,9 @@ public class DefaultTimerThreadPoolAdapt
             final ThreadPoolExecutor tpe = (ThreadPoolExecutor) executor;
             tpe.shutdown();
             if (arg0) {
+                int timeout = 
SystemInstance.get().getOptions().get(OPENEJB_EJB_TIMER_POOL_AWAIT_SECONDS, 5);
                 try {
-                    tpe.awaitTermination(1, TimeUnit.HOURS);
+                    tpe.awaitTermination(timeout, TimeUnit.SECONDS);
                 } catch (InterruptedException e) {
                     logger.error(e.getMessage(), e);
                 }

Modified: 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
URL: 
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java?rev=1384598&r1=1384597&r2=1384598&view=diff
==============================================================================
--- 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
 (original)
+++ 
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
 Thu Sep 13 23:22:45 2012
@@ -39,7 +39,6 @@ import org.quartz.TriggerKey;
 import org.quartz.impl.StdSchedulerFactory;
 import org.quartz.impl.triggers.AbstractTrigger;
 import org.quartz.simpl.RAMJobStore;
-import org.quartz.simpl.SimpleThreadPool;
 
 import javax.ejb.EJBContext;
 import javax.ejb.EJBException;
@@ -72,6 +71,7 @@ public class EjbTimerServiceImpl impleme
     public static final String OPENEJB_TIMEOUT_JOB_GROUP_NAME = 
"OPENEJB_TIMEOUT_GROUP";
 
     public static final String EJB_TIMER_RETRY_ATTEMPTS = 
"EjbTimer.RetryAttempts";
+    public static final String OPENEJB_QUARTZ_USE_TCCL = 
"openejb.quartz.use-TCCL";
 
     private boolean transacted;
     private int retryAttempts;
@@ -191,8 +191,18 @@ public class EjbTimerServiceImpl impleme
         Scheduler thisScheduler;
         if (scheduler == null || newInstance) {
             try {
-                thisScheduler = new 
StdSchedulerFactory(properties).getScheduler();
-                thisScheduler.start();
+                // start in container context to avoid thread leaks
+                final ClassLoader oldCl = 
Thread.currentThread().getContextClassLoader();
+                if 
(!"true".equals(deployment.getProperties().getProperty(OPENEJB_QUARTZ_USE_TCCL, 
"false"))) {
+                    
Thread.currentThread().setContextClassLoader(EjbTimerServiceImpl.class.getClassLoader());
+                }
+                try {
+                    thisScheduler = new 
StdSchedulerFactory(properties).getScheduler();
+                    thisScheduler.start();
+                } finally {
+                    Thread.currentThread().setContextClassLoader(oldCl);
+                }
+
                 //durability is configured with true, which means that the job 
will be kept in the store even if no trigger is attached to it.
                 //Currently, all the EJB beans share with the same job instance
                 JobDetail job = JobBuilder.newJob(EjbTimeoutJob.class)


Reply via email to