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


Reply via email to