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