You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by rm...@apache.org on 2013/09/04 14:04:04 UTC

svn commit: r1519990 - in /tomee/tomee/trunk/container/openejb-core/src: main/java/org/apache/openejb/core/timer/ test/java/org/apache/openejb/timer/ test/resources/

Author: rmannibucau
Date: Wed Sep  4 12:04:04 2013
New Revision: 1519990

URL: http://svn.apache.org/r1519990
Log:
correct serializability for TimerData and related expressions

Removed:
    tomee/tomee/trunk/container/openejb-core/src/test/resources/import-QuartzPersistenceForEJBTimersDBNoTx.sql
Modified:
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EJBCronTrigger.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerData.java
    tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/GetTimerTest.java
    tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/QuartzPersistenceForEJBTimersTest.java

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EJBCronTrigger.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EJBCronTrigger.java?rev=1519990&r1=1519989&r2=1519990&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EJBCronTrigger.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EJBCronTrigger.java Wed Sep  4 12:04:04 2013
@@ -21,6 +21,7 @@ import org.apache.openejb.util.Logger;
 import org.quartz.impl.triggers.CronTriggerImpl;
 
 import javax.ejb.ScheduleExpression;
+import java.io.Serializable;
 import java.text.DateFormatSymbols;
 import java.util.ArrayList;
 import java.util.Calendar;
@@ -576,7 +577,7 @@ public class EJBCronTrigger extends Cron
 
 	}
 
-	private abstract static class FieldExpression {
+	private abstract static class FieldExpression implements Serializable {
 
 
 		protected static final Calendar CALENDAR = new GregorianCalendar(Locale.US); // For getting min/max field values
@@ -624,14 +625,8 @@ public class EJBCronTrigger extends Cron
 		}
 		
 		protected boolean isValidResult(Calendar calendar, Integer result){
-		    
-		    if (result!=null && result>=calendar.getActualMinimum(field) && result <=calendar.getActualMaximum(field)){
-                return true;
-            } 
-		    
-		    return false;
-		    
-		}
+            return result != null && result >= calendar.getActualMinimum(field) && result <= calendar.getActualMaximum(field);
+        }
 
 		/**
 		 * Returns the next allowed value in this calendar for the given

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=1519990&r1=1519989&r2=1519990&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 Wed Sep  4 12:04:04 2013
@@ -125,6 +125,7 @@ public abstract class TimerData implemen
         out.writeObject(primaryKey);
         out.writeObject(timerService);
         out.writeObject(info);
+        out.writeObject(trigger);
         out.writeUTF(timeoutMethod.getName());
     }
 
@@ -143,12 +144,14 @@ public abstract class TimerData implemen
             primaryKey = in.readObject();
             timerService = (EjbTimerServiceImpl) in.readObject();
             info = in.readObject();
+            trigger = AbstractTrigger.class.cast(in.readObject());
         } catch (ClassNotFoundException e) {
             throw new IOException(e);
         }
 
         final String mtd = in.readUTF();
         final BeanContext beanContext = SystemInstance.get().getComponent(ContainerSystem.class).getBeanContext(deploymentId);
+        scheduler = timerService.getScheduler();
         for (Iterator<Map.Entry<Method, MethodContext>> it = beanContext.iteratorMethodContext(); it.hasNext(); ) {
             final MethodContext methodContext = it.next().getValue();
             /* this doesn't work in all cases

Modified: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/GetTimerTest.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/GetTimerTest.java?rev=1519990&r1=1519989&r2=1519990&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/GetTimerTest.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/GetTimerTest.java Wed Sep  4 12:04:04 2013
@@ -29,13 +29,16 @@ import javax.ejb.EJB;
 import javax.ejb.Lock;
 import javax.ejb.LockType;
 import javax.ejb.Schedule;
+import javax.ejb.ScheduleExpression;
 import javax.ejb.Singleton;
 import javax.ejb.Startup;
 import javax.ejb.Timeout;
 import javax.ejb.Timer;
 import javax.ejb.TimerConfig;
 import javax.ejb.TimerService;
+import java.util.Calendar;
 import java.util.Collection;
+import java.util.concurrent.Semaphore;
 
 import static org.junit.Assert.assertEquals;
 
@@ -54,6 +57,8 @@ public class GetTimerTest {
         assertEquals(0, bean.timers().size());
         bean.newTimer();
         assertEquals(1, bean.timers().size());
+        bean.awaitTimeout();
+        assertEquals(1, bean.timers().size());
     }
 
     @Singleton
@@ -61,17 +66,27 @@ public class GetTimerTest {
     @Lock(LockType.READ)
     public static class TimerLister {
         @Resource
-        private TimerService ts;
+        private TimerService timerService;
 
         private Timer timer = null;
+        private Semaphore sema = new Semaphore(0);
 
         @Timeout
         public void timeout(final Timer timer) {
-            // no-op: not important for that test
+            System.out.println("@Timeout");
+            sema.release();
+        }
+
+        public void awaitTimeout() {
+            try {
+                sema.acquire();
+            } catch (final InterruptedException e) {
+                // no-op
+            }
         }
 
         public Collection<Timer> timers() {
-            return ts.getTimers();
+            return timerService.getTimers();
         }
 
         @PreDestroy
@@ -87,7 +102,17 @@ public class GetTimerTest {
         }
 
         public void newTimer() {
-            timer = ts.createIntervalTimer(3000, 1000, new TimerConfig(System.currentTimeMillis(), false));
+            final TimerConfig tc = new TimerConfig("my-timer", true);
+            final ScheduleExpression se = new ScheduleExpression();
+            final Calendar calendar = Calendar.getInstance();
+            calendar.add(Calendar.SECOND, 2);
+            se.second(calendar.get(Calendar.SECOND) + "/3");
+            se.minute("*");
+            se.hour("*");
+            se.dayOfMonth("*");
+            se.dayOfWeek("*");
+            se.month("*");
+            timer = timerService.createCalendarTimer(se, tc);
         }
     }
 }

Modified: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/QuartzPersistenceForEJBTimersTest.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/QuartzPersistenceForEJBTimersTest.java?rev=1519990&r1=1519989&r2=1519990&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/QuartzPersistenceForEJBTimersTest.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/QuartzPersistenceForEJBTimersTest.java Wed Sep  4 12:04:04 2013
@@ -34,16 +34,19 @@ import javax.annotation.PreDestroy;
 import javax.annotation.Resource;
 import javax.ejb.EJB;
 import javax.ejb.Schedule;
+import javax.ejb.ScheduleExpression;
 import javax.ejb.Singleton;
 import javax.ejb.Timeout;
 import javax.ejb.Timer;
 import javax.ejb.TimerConfig;
 import javax.ejb.TimerService;
+import java.util.Calendar;
 import java.util.Collection;
 import java.util.Properties;
+import java.util.concurrent.Semaphore;
+import java.util.concurrent.TimeUnit;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNotNull;
 
 @RunWith(ApplicationComposer.class)
 public class QuartzPersistenceForEJBTimersTest {
@@ -52,10 +55,17 @@ public class QuartzPersistenceForEJBTime
 
     @Test
     public void doTest() {
-        assertNotNull(bean);
         assertEquals(0, bean.timers().size());
         bean.newTimer();
         assertEquals(1, bean.timers().size());
+        while (!bean.awaitTimeout()) {
+            try {
+                Thread.sleep(100);
+            } catch (InterruptedException e) {
+                // no-op
+            }
+        }
+        assertEquals(1, bean.timers().size());
     }
 
     @Module
@@ -99,10 +109,10 @@ public class QuartzPersistenceForEJBTime
             .p("QuartzPersistenceForEJBTimersDB.UserName", "SA")
             .p("QuartzPersistenceForEJBTimersDB.Password", "")
 
-            // see src/test/resources/import-QuartzPersistenceForEJBTimersDBNoTx.sql for the init script
+            // see src/test/resources/import-QuartzPersistenceForEJBTimersDBNoTx-.sql for the init script
             .p("QuartzPersistenceForEJBTimersDBNoTx", "new://Resource?type=DataSource")
             .p("QuartzPersistenceForEJBTimersDBNoTx.JtaManaged", "false")
-            .p("QuartzPersistenceForEJBTimersDBNoTx.JdbcUrl", "jdbc:hsqldb:mem:QuartzPersistenceForEJBTimersDBNoTx")
+            .p("QuartzPersistenceForEJBTimersDBNoTx.JdbcUrl", "jdbc:hsqldb:mem:QuartzPersistenceForEJBTimersDB")
             .p("QuartzPersistenceForEJBTimersDBNoTx.UserName", "SA")
             .p("QuartzPersistenceForEJBTimersDBNoTx.Password", "")
             .build();
@@ -111,17 +121,28 @@ public class QuartzPersistenceForEJBTime
     @Singleton
     public static class MyTimedEjb {
         @Resource
-        private TimerService ts;
+        private TimerService timerService;
 
         private Timer timer = null;
+        private Semaphore sema = new Semaphore(0);
 
         @Timeout
         public void timeout(final Timer timer) {
-            // no-op: not important for that test
+            System.out.println("@Timeout on " + timer.getInfo());
+            sema.release();
+        }
+
+        public boolean awaitTimeout() {
+            try {
+                return sema.tryAcquire(1, TimeUnit.SECONDS);
+            } catch (final InterruptedException e) {
+                // no-op
+            }
+            return false;
         }
 
         public Collection<Timer> timers() {
-            return ts.getTimers();
+            return timerService.getTimers();
         }
 
         @PreDestroy
@@ -137,7 +158,17 @@ public class QuartzPersistenceForEJBTime
         }
 
         public void newTimer() {
-            timer = ts.createIntervalTimer(3000, 1000, new TimerConfig(System.currentTimeMillis(), false));
+            final TimerConfig tc = new TimerConfig("my-timer", true);
+            final ScheduleExpression se = new ScheduleExpression();
+            final Calendar calendar = Calendar.getInstance();
+            calendar.add(Calendar.SECOND, 2);
+            se.second(calendar.get(Calendar.SECOND) + "/3");
+            se.minute("*");
+            se.hour("*");
+            se.dayOfMonth("*");
+            se.dayOfWeek("*");
+            se.month("*");
+            timer = timerService.createCalendarTimer(se, tc);
         }
     }
 }