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/02 12:04:24 UTC

svn commit: r1519379 - in /tomee/tomee/trunk/container/openejb-core/src: main/java/org/apache/openejb/assembler/classic/ main/java/org/apache/openejb/core/timer/ test/java/org/apache/openejb/timer/

Author: rmannibucau
Date: Mon Sep  2 10:04:23 2013
New Revision: 1519379

URL: http://svn.apache.org/r1519379
Log:
TOMEE-1011 calendar timer can be auto created or not

Added:
    tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/GetTimerTest.java
      - copied, changed from r1519376, tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/InitialIntervalTimerTest.java
Modified:
    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/timer/CalendarTimerData.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/DatabaseTimerStore.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/MemoryTimerStore.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerData.java
    tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerStore.java
    tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/EjbTimerImplSerializableTest.java

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=1519379&r1=1519378&r2=1519379&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 Mon Sep  2 10:04:23 2013
@@ -1034,7 +1034,8 @@ public class Assembler extends Assembler
                                                                null,
                                                                entry.getKey(),
                                                                scheduleData.getExpression(),
-                                                               scheduleData.getConfig());
+                                                               scheduleData.getConfig(),
+                                                                true);
                             }
                         }
                         beanContext.setEjbTimerService(timerService);

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/CalendarTimerData.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/CalendarTimerData.java?rev=1519379&r1=1519378&r2=1519379&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/CalendarTimerData.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/CalendarTimerData.java Mon Sep  2 10:04:23 2013
@@ -22,6 +22,9 @@ import org.quartz.impl.triggers.Abstract
 
 import javax.ejb.ScheduleExpression;
 import javax.ejb.TimerConfig;
+import java.io.IOException;
+import java.io.ObjectInputStream;
+import java.io.ObjectOutputStream;
 import java.lang.reflect.Method;
 
 /**
@@ -30,11 +33,13 @@ import java.lang.reflect.Method;
 public class CalendarTimerData extends TimerData {
     private static final long serialVersionUID = 1L;
 
-    private final ScheduleExpression scheduleExpression;
+    private ScheduleExpression scheduleExpression;
+    private boolean autoCreated;
 
-    public CalendarTimerData(long id, EjbTimerServiceImpl timerService, String deploymentId, Object primaryKey, Method timeoutMethod, TimerConfig timerConfig, ScheduleExpression scheduleExpression) {
+    public CalendarTimerData(long id, EjbTimerServiceImpl timerService, String deploymentId, Object primaryKey, Method timeoutMethod, TimerConfig timerConfig, ScheduleExpression scheduleExpression, boolean auto) {
         super(id, timerService, deploymentId, primaryKey, timeoutMethod, timerConfig);
         this.scheduleExpression = scheduleExpression;
+        this.autoCreated = auto;
     }
 
     @Override
@@ -46,6 +51,10 @@ public class CalendarTimerData extends T
         return scheduleExpression;
     }
 
+    public boolean isAutoCreated() {
+        return autoCreated;
+    }
+
     @Override
     public AbstractTrigger<?> initializeTrigger() {
         try {
@@ -57,6 +66,24 @@ public class CalendarTimerData extends T
     }
 
     @Override
+    protected void writeObject(final ObjectOutputStream out) throws IOException {
+        super.writeObject(out);
+        out.writeBoolean(autoCreated);
+        out.writeObject(scheduleExpression);
+    }
+
+    @Override
+    protected void readObject(final ObjectInputStream in) throws IOException {
+        super.readObject(in);
+        autoCreated = in.readBoolean();
+        try {
+            scheduleExpression = ScheduleExpression.class.cast(in.readObject());
+        } catch (ClassNotFoundException e) {
+            throw new IOException(e);
+        }
+    }
+
+    @Override
     public String toString() {
         return TimerType.Calendar.name() + " scheduleExpression = [" + scheduleExpression + "]";
     }

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/DatabaseTimerStore.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/DatabaseTimerStore.java?rev=1519379&r1=1519378&r2=1519379&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/DatabaseTimerStore.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/DatabaseTimerStore.java Mon Sep  2 10:04:23 2013
@@ -84,7 +84,7 @@ public class DatabaseTimerStore implemen
     }
 
     @Override
-    public TimerData createCalendarTimer(final EjbTimerServiceImpl timerService, final String deploymentId, final Object primaryKey, final Method timeoutMethod, final ScheduleExpression schedule, final TimerConfig timerConfig)
+    public TimerData createCalendarTimer(final EjbTimerServiceImpl timerService, final String deploymentId, final Object primaryKey, final Method timeoutMethod, final ScheduleExpression schedule, final TimerConfig timerConfig, final boolean autoCreated)
             throws TimerStoreException {
         // TODO Auto-generated method stub
         return null;

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=1519379&r1=1519378&r2=1519379&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 Mon Sep  2 10:04:23 2013
@@ -548,7 +548,9 @@ public class EjbTimerServiceImpl impleme
 
         final Collection<Timer> timers = new ArrayList<Timer>();
         for (final TimerData timerData : timerStore.getTimers((String) deployment.getDeploymentID())) {
-            timers.add(timerData.getTimer());
+            if (!CalendarTimerData.class.isInstance(timerData) || !CalendarTimerData.class.cast(timerData).isAutoCreated()) {
+                timers.add(timerData.getTimer());
+            }
         }
         return timers;
     }
@@ -665,7 +667,7 @@ public class EjbTimerServiceImpl impleme
         //TODO add more schedule expression validation logic ?
         checkState();
         try {
-            final TimerData timerData = timerStore.createCalendarTimer(this, (String) deployment.getDeploymentID(), primaryKey, timeoutMethod, scheduleExpression, timerConfig);
+            final TimerData timerData = timerStore.createCalendarTimer(this, (String) deployment.getDeploymentID(), primaryKey, timeoutMethod, scheduleExpression, timerConfig, false);
             initializeNewTimer(timerData);
             return timerData.getTimer();
         } catch (TimerStoreException e) {

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/MemoryTimerStore.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/MemoryTimerStore.java?rev=1519379&r1=1519378&r2=1519379&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/MemoryTimerStore.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/MemoryTimerStore.java Mon Sep  2 10:04:23 2013
@@ -17,6 +17,17 @@
 
 package org.apache.openejb.core.timer;
 
+import org.apache.openejb.util.LogCategory;
+import org.apache.openejb.util.Logger;
+
+import javax.ejb.ScheduleExpression;
+import javax.ejb.TimerConfig;
+import javax.transaction.RollbackException;
+import javax.transaction.Status;
+import javax.transaction.Synchronization;
+import javax.transaction.SystemException;
+import javax.transaction.Transaction;
+import javax.transaction.TransactionManager;
 import java.lang.ref.WeakReference;
 import java.lang.reflect.Method;
 import java.util.ArrayList;
@@ -32,18 +43,6 @@ import java.util.concurrent.atomic.Atomi
 import java.util.concurrent.locks.Lock;
 import java.util.concurrent.locks.ReentrantLock;
 
-import javax.ejb.ScheduleExpression;
-import javax.ejb.TimerConfig;
-import javax.transaction.RollbackException;
-import javax.transaction.Status;
-import javax.transaction.Synchronization;
-import javax.transaction.SystemException;
-import javax.transaction.Transaction;
-import javax.transaction.TransactionManager;
-
-import org.apache.openejb.util.LogCategory;
-import org.apache.openejb.util.Logger;
-
 public class MemoryTimerStore implements TimerStore {
     private static final long serialVersionUID = 1L;
     private static final Logger log = Logger.getInstance(LogCategory.TIMER, "org.apache.openejb.util.resources");
@@ -90,10 +89,10 @@ public class MemoryTimerStore implements
     }
 
     @Override
-    public TimerData createCalendarTimer(final EjbTimerServiceImpl timerService, final String deploymentId, final Object primaryKey, final Method timeoutMethod, final ScheduleExpression scheduleExpression, final TimerConfig timerConfig)
+    public TimerData createCalendarTimer(final EjbTimerServiceImpl timerService, final String deploymentId, final Object primaryKey, final Method timeoutMethod, final ScheduleExpression scheduleExpression, final TimerConfig timerConfig, final boolean auto)
             throws TimerStoreException {
         final long id = counter.incrementAndGet();
-        final TimerData timerData = new CalendarTimerData(id, timerService, deploymentId, primaryKey, timeoutMethod, timerConfig, scheduleExpression);
+        final TimerData timerData = new CalendarTimerData(id, timerService, deploymentId, primaryKey, timeoutMethod, timerConfig, scheduleExpression, auto);
         getTasks().addTimerData(timerData);
         return timerData;
     }

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=1519379&r1=1519378&r2=1519379&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 Mon Sep  2 10:04:23 2013
@@ -59,6 +59,7 @@ public abstract class TimerData implemen
 
     private Object info;
     private boolean persistent;
+    private boolean autoScheduled;
 
     protected AbstractTrigger<?> trigger;
     
@@ -111,10 +112,11 @@ public abstract class TimerData implemen
         this.timeoutMethod = timeoutMethod;
     }
 
-    private void writeObject(final ObjectOutputStream out) throws IOException {
+    protected void writeObject(final ObjectOutputStream out) throws IOException {
         out.writeLong(id);
         out.writeUTF(deploymentId);
         out.writeBoolean(persistent);
+        out.writeBoolean(autoScheduled);
         out.writeObject(timer);
         out.writeObject(primaryKey);
         out.writeObject(timerService);
@@ -122,10 +124,11 @@ public abstract class TimerData implemen
         out.writeUTF(timeoutMethod.getName());
     }
 
-    private void readObject(final ObjectInputStream in) throws IOException {
+    protected void readObject(final ObjectInputStream in) throws IOException {
         id = in.readLong();
         deploymentId = in.readUTF();
         persistent = in.readBoolean();
+        autoScheduled = in.readBoolean();
 
         try {
             timer = (Timer) in.readObject();

Modified: tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerStore.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerStore.java?rev=1519379&r1=1519378&r2=1519379&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerStore.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/main/java/org/apache/openejb/core/timer/TimerStore.java Mon Sep  2 10:04:23 2013
@@ -17,13 +17,12 @@
 
 package org.apache.openejb.core.timer;
 
+import javax.ejb.ScheduleExpression;
+import javax.ejb.TimerConfig;
 import java.lang.reflect.Method;
 import java.util.Collection;
 import java.util.Date;
 
-import javax.ejb.ScheduleExpression;
-import javax.ejb.TimerConfig;
-
 public interface TimerStore {
 
     TimerData getTimer(String deploymentId, long timerId);
@@ -40,7 +39,7 @@ public interface TimerStore {
     TimerData createIntervalTimer(EjbTimerServiceImpl timerService, String deploymentId, Object primaryKey, Method timeoutMethod, Date initialExpiration, long intervalDuration, TimerConfig timerConfig)
             throws TimerStoreException;
 
-    TimerData createCalendarTimer(EjbTimerServiceImpl timerService, String deploymentId, Object primaryKey, Method timeoutMethod, ScheduleExpression schedule, TimerConfig timerConfig)
+    TimerData createCalendarTimer(EjbTimerServiceImpl timerService, String deploymentId, Object primaryKey, Method timeoutMethod, ScheduleExpression schedule, TimerConfig timerConfig, boolean auto)
             throws TimerStoreException;
 
     void removeTimer(long timerId);

Modified: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/EjbTimerImplSerializableTest.java
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/EjbTimerImplSerializableTest.java?rev=1519379&r1=1519378&r2=1519379&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/EjbTimerImplSerializableTest.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/EjbTimerImplSerializableTest.java Mon Sep  2 10:04:23 2013
@@ -157,7 +157,7 @@ public class EjbTimerImplSerializableTes
         final EjbTimerService timer = context.getEjbTimerService();
         final MethodContext ctx = context.getMethodContext(EJBWithTimer.class.getMethod("doSthg"));
         final ScheduleData sd = ctx.getSchedules().iterator().next();
-        return new CalendarTimerData(1, (EjbTimerServiceImpl) timer, context.getDeploymentID().toString(), null, ctx.getBeanMethod(), sd.getConfig(), sd.getExpression());
+        return new CalendarTimerData(1, (EjbTimerServiceImpl) timer, context.getDeploymentID().toString(), null, ctx.getBeanMethod(), sd.getConfig(), sd.getExpression(), false);
     }
 
     @Module

Copied: tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/GetTimerTest.java (from r1519376, tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/InitialIntervalTimerTest.java)
URL: http://svn.apache.org/viewvc/tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/GetTimerTest.java?p2=tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/GetTimerTest.java&p1=tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/InitialIntervalTimerTest.java&r1=1519376&r2=1519379&rev=1519379&view=diff
==============================================================================
--- tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/InitialIntervalTimerTest.java (original)
+++ tomee/tomee/trunk/container/openejb-core/src/test/java/org/apache/openejb/timer/GetTimerTest.java Mon Sep  2 10:04:23 2013
@@ -23,66 +23,71 @@ import org.apache.openejb.testing.Module
 import org.junit.Test;
 import org.junit.runner.RunWith;
 
-import javax.annotation.PostConstruct;
 import javax.annotation.PreDestroy;
 import javax.annotation.Resource;
 import javax.ejb.EJB;
 import javax.ejb.Lock;
 import javax.ejb.LockType;
+import javax.ejb.Schedule;
 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.Collection;
 
 import static org.junit.Assert.assertEquals;
 
 @RunWith(ApplicationComposer.class)
-public class InitialIntervalTimerTest {
+public class GetTimerTest {
     @Module
     public EnterpriseBean bean() {
-        return new SingletonBean(TimerWithDelay.class).localBean();
+        return new SingletonBean(TimerLister.class).localBean();
     }
 
     @EJB
-    private TimerWithDelay bean;
+    private TimerLister bean;
 
     @Test
     public void test() throws InterruptedException {
-        Thread.sleep(5400);
-        assertEquals(3, bean.getOk());
+        assertEquals(0, bean.timers().size());
+        bean.newTimer();
+        assertEquals(1, bean.timers().size());
     }
 
     @Singleton
     @Startup
     @Lock(LockType.READ)
-    public static class TimerWithDelay {
+    public static class TimerLister {
         @Resource
         private TimerService ts;
 
-        private Timer timer;
-        private int ok = 0;
-
-        @PostConstruct
-        public void start() {
-            timer = ts.createIntervalTimer(3000, 1000, new TimerConfig(System.currentTimeMillis(), false));
-        }
+        private Timer timer = null;
 
         @Timeout
         public void timeout(final Timer timer) {
-            final long actual = System.currentTimeMillis() - ((Long) timer.getInfo() + 1000 * ok + 3000);
-            assertEquals(0, actual, 500);
-            ok++;
+            // no-op: not important for that test
         }
 
-        public int getOk() {
-            return ok;
+        public Collection<Timer> timers() {
+            return ts.getTimers();
         }
 
         @PreDestroy
         public void stop() {
-            timer.cancel();
+            if (timer != null) {
+                timer.cancel();
+            }
+        }
+
+        @Schedule
+        public void justToCheckZeroTimersInListAtStartup() {
+            // no-op
+        }
+
+        public void newTimer() {
+            timer = ts.createIntervalTimer(3000, 1000, new TimerConfig(System.currentTimeMillis(), false));
         }
     }
 }