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