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)