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);