[Jboss-cvs] JBossAS SVN: r56264 - in trunk/ejb3/src: main/org/jboss/ejb3 main/org/jboss/ejb3/mdb main/org/jboss/ejb3/service main/org/jboss/ejb3/stateful main/org/jboss/ejb3/stateless main/org/jboss/ejb3/timerservice main/org/jboss/ejb3/timerservice/jboss main/org/jboss/ejb3/timerservice/quartz test/org/jboss/ejb3/test/timer test/org/jboss/ejb3/test/timer/unit

jboss-cvs-commits at lists.jboss.org jboss-cvs-commits at lists.jboss.org
Fri Aug 25 07:53:04 EDT 2006


Author: wolfc
Date: 2006-08-25 07:52:43 -0400 (Fri, 25 Aug 2006)
New Revision: 56264

Modified:
   trunk/ejb3/src/main/org/jboss/ejb3/Container.java
   trunk/ejb3/src/main/org/jboss/ejb3/ServiceDelegateWrapper.java
   trunk/ejb3/src/main/org/jboss/ejb3/ServiceDelegateWrapperMBean.java
   trunk/ejb3/src/main/org/jboss/ejb3/mdb/MessagingContainer.java
   trunk/ejb3/src/main/org/jboss/ejb3/service/ServiceContainer.java
   trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulContainer.java
   trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessContainer.java
   trunk/ejb3/src/main/org/jboss/ejb3/timerservice/TimerServiceFactory.java
   trunk/ejb3/src/main/org/jboss/ejb3/timerservice/jboss/JBossTimerServiceFactory.java
   trunk/ejb3/src/main/org/jboss/ejb3/timerservice/jboss/TimerServiceFacade.java
   trunk/ejb3/src/main/org/jboss/ejb3/timerservice/quartz/QuartzTimerServiceFactory.java
   trunk/ejb3/src/test/org/jboss/ejb3/test/timer/BaseTimerTesterBean.java
   trunk/ejb3/src/test/org/jboss/ejb3/test/timer/TimerTester.java
   trunk/ejb3/src/test/org/jboss/ejb3/test/timer/unit/RemoteUnitTestCase.java
Log:
EJBTHREE-630: persist timers on undeployment

Modified: trunk/ejb3/src/main/org/jboss/ejb3/Container.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/Container.java	2006-08-25 11:50:08 UTC (rev 56263)
+++ trunk/ejb3/src/main/org/jboss/ejb3/Container.java	2006-08-25 11:52:43 UTC (rev 56264)
@@ -45,6 +45,11 @@
 
    TimerService getTimerService();
 
+   /**
+    * This method is called by EJBTimerServiceImpl to re-establish a persistent timer.
+    */
+   TimerService getTimerService(Object pKey);
+
    Pool getPool();
 
    Object construct();

Modified: trunk/ejb3/src/main/org/jboss/ejb3/ServiceDelegateWrapper.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/ServiceDelegateWrapper.java	2006-08-25 11:50:08 UTC (rev 56263)
+++ trunk/ejb3/src/main/org/jboss/ejb3/ServiceDelegateWrapper.java	2006-08-25 11:52:43 UTC (rev 56264)
@@ -23,6 +23,9 @@
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+
+import javax.ejb.TimerService;
+
 import org.jboss.system.ServiceMBeanSupport;
 
 /**
@@ -138,4 +141,10 @@
          else throw new RuntimeException(t);
       }
    }
+   
+   // FIXME: this is here for EJBTHREE-630, re-establishing timers
+   public TimerService getTimerService(Object pKey)
+   {
+      return ((Container) delegate).getTimerService(pKey);
+   }
 }

Modified: trunk/ejb3/src/main/org/jboss/ejb3/ServiceDelegateWrapperMBean.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/ServiceDelegateWrapperMBean.java	2006-08-25 11:50:08 UTC (rev 56263)
+++ trunk/ejb3/src/main/org/jboss/ejb3/ServiceDelegateWrapperMBean.java	2006-08-25 11:52:43 UTC (rev 56264)
@@ -21,6 +21,8 @@
 */
 package org.jboss.ejb3;
 
+import javax.ejb.TimerService;
+
 import org.jboss.system.ServiceMBean;
 
 /**
@@ -31,4 +33,6 @@
  */
 public interface ServiceDelegateWrapperMBean extends ServiceMBean
 {
+   // FIXME: this is here to re-establish timers (EJBTHREE-630), do not use for other purposes
+   TimerService getTimerService(Object pKey);
 }

Modified: trunk/ejb3/src/main/org/jboss/ejb3/mdb/MessagingContainer.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/mdb/MessagingContainer.java	2006-08-25 11:50:08 UTC (rev 56263)
+++ trunk/ejb3/src/main/org/jboss/ejb3/mdb/MessagingContainer.java	2006-08-25 11:52:43 UTC (rev 56264)
@@ -149,6 +149,8 @@
       timerService = TimerServiceFactory.getInstance().createTimerService(this.getObjectName(), this);
 
       startProxies();
+      
+      TimerServiceFactory.getInstance().restoreTimerService(timerService);
    }
 
    protected void innerStart() throws Exception
@@ -254,6 +256,12 @@
       return timerService;
    }
 
+   public TimerService getTimerService(Object pKey)
+   {
+      assert timerService != null : "Timer Service not yet initialized";
+      return timerService;
+   }
+   
    public void callTimeout(Timer timer) throws Exception
    {
       Method timeout = callbackHandler.getTimeoutCallback();

Modified: trunk/ejb3/src/main/org/jboss/ejb3/service/ServiceContainer.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/service/ServiceContainer.java	2006-08-25 11:50:08 UTC (rev 56263)
+++ trunk/ejb3/src/main/org/jboss/ejb3/service/ServiceContainer.java	2006-08-25 11:52:43 UTC (rev 56264)
@@ -145,6 +145,8 @@
          injectDependencies(beanContext);
 
          registerManagementInterface();
+         
+         TimerServiceFactory.getInstance().restoreTimerService(timerService);
       }
       catch (Exception e)
       {
@@ -181,6 +183,12 @@
       return timerService;
    }
 
+   public TimerService getTimerService(Object pKey)
+   {
+      assert timerService != null : "Timer Service not yet initialized";
+      return timerService;
+   }
+   
    public void invokePostConstruct(BeanContext beanContext)
    {
       //Ignore

Modified: trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulContainer.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulContainer.java	2006-08-25 11:50:08 UTC (rev 56263)
+++ trunk/ejb3/src/main/org/jboss/ejb3/stateful/StatefulContainer.java	2006-08-25 11:52:43 UTC (rev 56264)
@@ -350,10 +350,14 @@
 
    public TimerService getTimerService()
    {
-      throw new RuntimeException(
-              "Illegal operation.  StrictlyPooledSessionBean beans can't access TimerService");
+      throw new UnsupportedOperationException("stateful bean doesn't support TimerService (EJB3 18.2#2)");
    }
 
+   public TimerService getTimerService(Object pKey)
+   {
+      return getTimerService();
+   }
+   
    @Override
    public void invokePostActivate(BeanContext beanContext)
    {

Modified: trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessContainer.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessContainer.java	2006-08-25 11:50:08 UTC (rev 56263)
+++ trunk/ejb3/src/main/org/jboss/ejb3/stateless/StatelessContainer.java	2006-08-25 11:52:43 UTC (rev 56264)
@@ -96,6 +96,8 @@
          super.start();
          //timerService = EjbTimerUtil.getTimerService(this, this);
          timerService = TimerServiceFactory.getInstance().createTimerService(this.getObjectName(), this);
+         
+         TimerServiceFactory.getInstance().restoreTimerService(timerService);
       }
       catch (Exception e)
       {
@@ -123,6 +125,12 @@
       return timerService;
    }
 
+   public TimerService getTimerService(Object pKey)
+   {
+      assert timerService != null : "Timer Service not yet initialized";
+      return timerService;
+   }
+   
    public void callTimeout(Timer timer) throws Exception
    {
       Method timeout = callbackHandler.getTimeoutCallback();

Modified: trunk/ejb3/src/main/org/jboss/ejb3/timerservice/TimerServiceFactory.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/timerservice/TimerServiceFactory.java	2006-08-25 11:50:08 UTC (rev 56263)
+++ trunk/ejb3/src/main/org/jboss/ejb3/timerservice/TimerServiceFactory.java	2006-08-25 11:52:43 UTC (rev 56264)
@@ -77,4 +77,11 @@
    }
    
    public abstract void removeTimerService(TimerService timerService);
+   
+   /**
+    * Restores the timers held with the specified timer service.
+    * 
+    * @param timerService
+    */
+   public abstract void restoreTimerService(TimerService timerService);
 }

Modified: trunk/ejb3/src/main/org/jboss/ejb3/timerservice/jboss/JBossTimerServiceFactory.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/timerservice/jboss/JBossTimerServiceFactory.java	2006-08-25 11:50:08 UTC (rev 56263)
+++ trunk/ejb3/src/main/org/jboss/ejb3/timerservice/jboss/JBossTimerServiceFactory.java	2006-08-25 11:52:43 UTC (rev 56264)
@@ -25,6 +25,7 @@
 import javax.management.ObjectName;
 
 import org.jboss.ejb.txtimer.EJBTimerService;
+import org.jboss.ejb3.EJBContainer;
 import org.jboss.ejb3.timerservice.TimedObjectInvoker;
 import org.jboss.ejb3.timerservice.TimerServiceFactory;
 import org.jboss.logging.Logger;
@@ -45,13 +46,14 @@
     * @see org.jboss.ejb3.timerservice.TimerServiceFactory#createTimerService(javax.management.ObjectName, org.jboss.ejb3.timerservice.TimedObjectInvoker)
     */
    @Override
-   public TimerService createTimerService(ObjectName objectName, TimedObjectInvoker invoker)
+   public TimerService createTimerService(ObjectName containerId, TimedObjectInvoker invoker)
    {
       TimerService timerService = null;
       try
       {
-         EJBTimerService service = (EJBTimerService) MBeanProxyExt.create(EJBTimerService.class, EJBTimerService.OBJECT_NAME, MBeanServerLocator.locateJBoss());
-         timerService = new TimerServiceFacade(objectName, service.createTimerService(objectName, null, invoker));
+         EJBTimerService service = getEJBTimerService();
+         TimerService delegate = service.createTimerService(containerId, null, invoker);
+         timerService = new TimerServiceFacade(containerId, delegate);
       }
       catch (Exception e)
       {
@@ -68,20 +70,25 @@
       return timerService;
    }
 
+   protected EJBTimerService getEJBTimerService()
+   {
+      return (EJBTimerService) MBeanProxyExt.create(EJBTimerService.class, EJBTimerService.OBJECT_NAME, MBeanServerLocator.locateJBoss());
+   }
+   
    /* (non-Javadoc)
     * @see org.jboss.ejb3.timerservice.TimerServiceFactory#removeTimerService(javax.ejb.TimerService)
     */
    @Override
    public void removeTimerService(TimerService timerService)
    {
-      removeTimerService(((TimerServiceFacade) timerService).getObjectName());
+      removeTimerService(((TimerServiceFacade) timerService).getContainerId());
    }
 
    protected void removeTimerService(ObjectName containerId)
    {
       try
       {
-         EJBTimerService service = (EJBTimerService) MBeanProxyExt.create(EJBTimerService.class, EJBTimerService.OBJECT_NAME, MBeanServerLocator.locateJBoss());
+         EJBTimerService service = getEJBTimerService();
          service.removeTimerService(containerId, true);
       }
       catch (Exception e)
@@ -97,4 +104,14 @@
          }
       }
    }
+   
+   public void restoreTimerService(TimerService aTimerService)
+   {
+      TimerServiceFacade timerService = (TimerServiceFacade) aTimerService;
+      EJBContainer container = timerService.getContainer();
+      // FIXME: do not assume that a TimedObjectInvoker is an EJBContainer
+      ClassLoader loader = container.getClassloader();
+      
+      getEJBTimerService().restoreTimers(timerService.getContainerId(), loader);
+   }
 }

Modified: trunk/ejb3/src/main/org/jboss/ejb3/timerservice/jboss/TimerServiceFacade.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/timerservice/jboss/TimerServiceFacade.java	2006-08-25 11:50:08 UTC (rev 56263)
+++ trunk/ejb3/src/main/org/jboss/ejb3/timerservice/jboss/TimerServiceFacade.java	2006-08-25 11:52:43 UTC (rev 56264)
@@ -30,6 +30,9 @@
 import javax.ejb.TimerService;
 import javax.management.ObjectName;
 
+import org.jboss.ejb3.EJBContainer;
+import org.jboss.ejb3.Ejb3Registry;
+
 /**
  * Comment
  *
@@ -68,13 +71,18 @@
       return delegate.createTimer(duration, info);
    }
 
-   public Collection getTimers() throws IllegalStateException, EJBException
+   protected EJBContainer getContainer()
    {
-      return delegate.getTimers();
+      return (EJBContainer) Ejb3Registry.getContainer(getContainerId().getCanonicalName());
    }
    
-   protected ObjectName getObjectName()
+   protected ObjectName getContainerId()
    {
       return containerId;
    }
+   
+   public Collection getTimers() throws IllegalStateException, EJBException
+   {
+      return delegate.getTimers();
+   }
 }

Modified: trunk/ejb3/src/main/org/jboss/ejb3/timerservice/quartz/QuartzTimerServiceFactory.java
===================================================================
--- trunk/ejb3/src/main/org/jboss/ejb3/timerservice/quartz/QuartzTimerServiceFactory.java	2006-08-25 11:50:08 UTC (rev 56263)
+++ trunk/ejb3/src/main/org/jboss/ejb3/timerservice/quartz/QuartzTimerServiceFactory.java	2006-08-25 11:52:43 UTC (rev 56264)
@@ -210,6 +210,11 @@
       timerService.shutdown();
    }
    
+   public void restoreTimerService(TimerService aTimerService)
+   {
+      // TODO: implement Quartz restore timer service
+   }
+   
    public void setDataSource(String jndiName)
    {
       JNDIConnectionProvider connectionProvider = new JNDIConnectionProvider(jndiName, false);

Modified: trunk/ejb3/src/test/org/jboss/ejb3/test/timer/BaseTimerTesterBean.java
===================================================================
--- trunk/ejb3/src/test/org/jboss/ejb3/test/timer/BaseTimerTesterBean.java	2006-08-25 11:50:08 UTC (rev 56263)
+++ trunk/ejb3/src/test/org/jboss/ejb3/test/timer/BaseTimerTesterBean.java	2006-08-25 11:52:43 UTC (rev 56264)
@@ -60,18 +60,29 @@
       
    }
    
-   public void startTimer(long pPeriod)
+   private void reset()
    {
       timerCalled = false;
       timer = null;
+   }
+   
+   public void setTimer(Date expiration)
+   {
+      reset();
+      System.out.println("************ set timer " + expiration);
+      timer = timerService.createTimer(expiration, "TimerSLSBean");
+   }
+   
+   public void startTimer(long pPeriod)
+   {
+      reset();
       System.out.println("************ startTimer");
       timer = timerService.createTimer(new Date(new Date().getTime() + pPeriod), "TimerSLSBean");
    }
 
    public void startTimerAndRollback(long pPeriod)
    {
-      timerCalled = false;
-      timer = null;
+      reset();
       System.out.println("************ startTimerAndRollback");
       timer = ctx.getTimerService().createTimer(pPeriod, "TimerSLSBean");
       ctx.setRollbackOnly();
@@ -79,8 +90,7 @@
 
    public void startTimerViaEJBContext(long pPeriod)
    {
-      timerCalled = false;
-      timer = null;
+      reset();
       System.out.println("************ startTimerViaEJBContext");
       timer = ctx.getTimerService().createTimer(new Date(new Date().getTime() + pPeriod), "TimerSLSBean");
    }

Modified: trunk/ejb3/src/test/org/jboss/ejb3/test/timer/TimerTester.java
===================================================================
--- trunk/ejb3/src/test/org/jboss/ejb3/test/timer/TimerTester.java	2006-08-25 11:50:08 UTC (rev 56263)
+++ trunk/ejb3/src/test/org/jboss/ejb3/test/timer/TimerTester.java	2006-08-25 11:52:43 UTC (rev 56264)
@@ -21,8 +21,10 @@
   */
 package org.jboss.ejb3.test.timer;
 
+import java.util.Date;
 
 
+
 /**
  * Comment
  *
@@ -39,6 +41,8 @@
 
    void accessTimer();
    
+   void setTimer(Date expiration);
+   
    void startTimerAndRollback(long pPeriod);
    
    void startTimerViaEJBContext(long pPeriod);

Modified: trunk/ejb3/src/test/org/jboss/ejb3/test/timer/unit/RemoteUnitTestCase.java
===================================================================
--- trunk/ejb3/src/test/org/jboss/ejb3/test/timer/unit/RemoteUnitTestCase.java	2006-08-25 11:50:08 UTC (rev 56263)
+++ trunk/ejb3/src/test/org/jboss/ejb3/test/timer/unit/RemoteUnitTestCase.java	2006-08-25 11:52:43 UTC (rev 56264)
@@ -21,6 +21,8 @@
   */
 package org.jboss.ejb3.test.timer.unit;
 
+import java.util.Date;
+
 import org.jboss.ejb3.test.timer.TimerTester;
 import org.jboss.test.JBossTestCase;
 import junit.framework.Test;
@@ -56,6 +58,22 @@
       assertTrue(test.isTimerCalled());
    }
    
+   // EJBTHREE-630
+   public void testPersistence() throws Exception
+   {
+      TimerTester test = (TimerTester) getInitialContext().lookup("TimerTesterService/remote");
+      long when = System.currentTimeMillis() + 5000;
+      test.setTimer(new Date(when));
+      
+      redeploy("timer-test.jar");
+      
+      test = (TimerTester) getInitialContext().lookup("TimerTesterService/remote");
+      long wait = 1000 + (when - System.currentTimeMillis());
+      if(wait > 0)
+         Thread.sleep(wait);
+      assertTrue(test.isTimerCalled());
+   }
+   
    public void testService() throws Exception
    {
       TimerTester test = (TimerTester) getInitialContext().lookup("TimerTesterService/remote");




More information about the jboss-cvs-commits mailing list