Author: rmannibucau
Date: Tue Mar 5 12:38:18 2013
New Revision: 1452767
URL: http://svn.apache.org/r1452767
Log:
TOMEE-782 pausing/resuming persistent timers instead of unscheduling the job
Modified:
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/entity/EntityContainer.java
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerData.java
Modified:
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
URL:
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java?rev=1452767&r1=1452766&r2=1452767&view=diff
==============================================================================
---
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
(original)
+++
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
Tue Mar 5 12:38:18 2013
@@ -1664,7 +1664,7 @@ public class BeanContext extends Deploym
public void stop() {
if (ejbTimerService != null && ejbTimerService instanceof
EjbTimerServiceImpl) {
- ((EjbTimerServiceImpl) ejbTimerService).shutdownMe();
+ ((EjbTimerServiceImpl) ejbTimerService).stop();
}
}
Modified:
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL:
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?rev=1452767&r1=1452766&r2=1452767&view=diff
==============================================================================
---
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
(original)
+++
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
Tue Mar 5 12:38:18 2013
@@ -129,6 +129,7 @@ import org.apache.xbean.finder.UrlSet;
import org.apache.xbean.recipe.ObjectRecipe;
import org.apache.xbean.recipe.Option;
import org.apache.xbean.recipe.UnsetPropertiesRecipe;
+import org.quartz.Scheduler;
import javax.enterprise.context.Dependent;
import javax.enterprise.context.spi.CreationalContext;
@@ -839,6 +840,8 @@ public class Assembler extends Assembler
logger.info("createApplication.success", appInfo.path);
+ resumePersistentSchedulers(appContext);
+
return appContext;
} catch (ValidationException ve) {
throw ve;
@@ -852,6 +855,24 @@ public class Assembler extends Assembler
}
}
+ private void resumePersistentSchedulers(final AppContext appContext) {
+ final Scheduler globalScheduler =
SystemInstance.get().getComponent(Scheduler.class);
+ final Collection<Scheduler> schedulers = new ArrayList<Scheduler>();
+ for (final BeanContext ejb : appContext.getBeanContexts()) {
+ final Scheduler scheduler = ejb.get(Scheduler.class);
+ if (scheduler == globalScheduler ||
schedulers.contains(scheduler)) {
+ continue;
+ }
+
+ schedulers.add(scheduler);
+ try {
+ scheduler.resumeAll();
+ } catch (final Exception e) {
+ logger.warning("Can't resume scheduler for " +
ejb.getEjbName(), e);
+ }
+ }
+ }
+
public List<BeanContext> initEjbs(final ClassLoader classLoader, final
AppInfo appInfo, final AppContext appContext,
final Set<Injection> injections,
final List<BeanContext> allDeployments, final String webappId) throws
OpenEJBException {
final EjbJarBuilder ejbJarBuilder = new EjbJarBuilder(props,
appContext);
Modified:
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java
URL:
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java?rev=1452767&r1=1452766&r2=1452767&view=diff
==============================================================================
---
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java
(original)
+++
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java
Tue Mar 5 12:38:18 2013
@@ -187,10 +187,6 @@ public class CmpContainer implements Rpc
}
public void undeploy(BeanContext beanContext) throws OpenEJBException {
- EjbTimerService timerService = beanContext.getEjbTimerService();
- if (timerService != null) {
- timerService.stop();
- }
synchronized (this) {
deploymentsById.remove(beanContext.getDeploymentID());
beansByClass.remove(beanContext.getCmpImplClass());
Modified:
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/entity/EntityContainer.java
URL:
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/entity/EntityContainer.java?rev=1452767&r1=1452766&r2=1452767&view=diff
==============================================================================
---
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/entity/EntityContainer.java
(original)
+++
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/entity/EntityContainer.java
Tue Mar 5 12:38:18 2013
@@ -124,11 +124,6 @@ public class EntityContainer implements
}
public void undeploy(BeanContext info) throws OpenEJBException {
- EjbTimerService timerService = info.getEjbTimerService();
- if (timerService != null) {
- timerService.stop();
- }
-
instanceManager.undeploy(info);
synchronized (this) {
Modified:
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java
URL:
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java?rev=1452767&r1=1452766&r2=1452767&view=diff
==============================================================================
---
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java
(original)
+++
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java
Tue Mar 5 12:38:18 2013
@@ -138,11 +138,6 @@ public class SingletonContainer implemen
ThreadContext.exit(old);
}
- EjbTimerService timerService = beanContext.getEjbTimerService();
- if (timerService != null) {
- timerService.stop();
- }
-
instanceManager.undeploy(beanContext);
synchronized (this) {
Modified:
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java
URL:
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java?rev=1452767&r1=1452766&r2=1452767&view=diff
==============================================================================
---
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java
(original)
+++
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java
Tue Mar 5 12:38:18 2013
@@ -128,12 +128,6 @@ public class StatelessContainer implemen
}
public void undeploy(BeanContext beanContext) {
-
- EjbTimerService timerService = beanContext.getEjbTimerService();
- if (timerService != null) {
- timerService.stop();
- }
-
instanceManager.undeploy(beanContext);
synchronized (this) {
Modified:
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
URL:
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java?rev=1452767&r1=1452766&r2=1452767&view=diff
==============================================================================
---
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
(original)
+++
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
Tue Mar 5 12:38:18 2013
@@ -152,7 +152,9 @@ public class EjbTimerServiceImpl impleme
putAll(properties, deployment.getModuleContext().getProperties());
putAll(properties, deployment.getProperties());
- // custom config -> don't use default scheduler
+ // custom config -> don't use default/global scheduler
+ // if one day we want to keep a global config for a global
scheduler (SystemInstance.get().getProperties()) we'll need to manage
resume/pause etc correctly by app
+ // since we have a scheduler by ejb today in such a case we don't
need
final boolean newInstance = properties.size() > 0;
final SystemInstance systemInstance = SystemInstance.get();
@@ -261,7 +263,8 @@ public class EjbTimerServiceImpl impleme
}
}
- public void shutdownMe() {
+ @Override
+ public void stop() {
cleanTimerData();
shutdownMyScheduler();
}
@@ -284,8 +287,8 @@ public class EjbTimerServiceImpl impleme
final TriggerKey key = trigger.getKey();
try {
- scheduler.unscheduleJob(key);
- } catch (SchedulerException ignored) {
+ data.stop();
+ } catch (final EJBException ignored) {
log.warning("An error occured deleting trigger '" + key + "'
on bean " + deployment.getDeploymentID());
}
}
@@ -346,6 +349,14 @@ public class EjbTimerServiceImpl impleme
public void run() {
try {
s.getListenerManager().addSchedulerListener(new
SchedulerListenerSupport() {
+ @Override
+ public void schedulerShuttingdown() {
+ try {
+ s.pauseAll();
+ } catch (SchedulerException e) {
+ // no-op
+ }
+ }
@Override
public void schedulerShutdown() {
@@ -422,20 +433,6 @@ public class EjbTimerServiceImpl impleme
}
}
- @Override
- public void stop() {
- // stop all timers
- for (final TimerData timerData : timerStore.getTimers((String)
deployment.getDeploymentID())) {
- try {
- timerData.stop();
- } catch (EJBException e) {
- //Suppress all the exception as we are in the shutdown process
- log.error("fail to stop timer", e);
- }
- }
- //scheduler.shutdown();
- }
-
public TransactionManager getTransactionManager() {
return transactionManager;
}
Modified:
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerData.java
URL:
http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerData.java?rev=1452767&r1=1452766&r2=1452767&view=diff
==============================================================================
---
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerData.java
(original)
+++
tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerData.java
Tue Mar 5 12:38:18 2013
@@ -104,7 +104,7 @@ public abstract class TimerData implemen
this.deploymentId = deploymentId;
this.primaryKey = primaryKey;
this.info = timerConfig == null ? null : timerConfig.getInfo();
- this.persistent = timerConfig == null ? true :
timerConfig.isPersistent();
+ this.persistent = timerConfig == null || timerConfig.isPersistent();
this.timer = new TimerImpl(this);
this.timeoutMethod = timeoutMethod;
}
@@ -159,7 +159,11 @@ public abstract class TimerData implemen
final Scheduler s = timerService.getScheduler();
if(!s.isShutdown()) {
- s.unscheduleJob(trigger.getKey());
+ if (!isPersistent()) {
+ s.unscheduleJob(trigger.getKey());
+ } else {
+ s.pauseTrigger(trigger.getKey());
+ }
}
} catch (SchedulerException e) {
throw new EJBException("fail to cancel the timer", e);