Author: rmannibucau Date: Wed Mar 6 17:10:38 2013 New Revision: 1453433 URL: http://svn.apache.org/r1453433 Log: TOMEE-785 ability to configure the timer store
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/EjbTimerServiceImpl.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=1453433&r1=1453432&r2=1453433&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 Wed Mar 6 17:10:38 2013 @@ -28,6 +28,7 @@ import org.apache.openejb.BeanContext; import org.apache.openejb.BeanType; import org.apache.openejb.ClassLoaderUtil; import org.apache.openejb.Container; +import org.apache.openejb.DeploymentContext; import org.apache.openejb.DuplicateDeploymentIdException; import org.apache.openejb.Injection; import org.apache.openejb.JndiConstants; @@ -72,6 +73,7 @@ import org.apache.openejb.core.ivm.namin import org.apache.openejb.core.ivm.naming.IvmJndiFactory; import org.apache.openejb.core.security.SecurityContextHandler; import org.apache.openejb.core.timer.EjbTimerServiceImpl; +import org.apache.openejb.core.timer.MemoryTimerStore; import org.apache.openejb.core.timer.NullEjbTimerServiceImpl; import org.apache.openejb.core.timer.ScheduleData; import org.apache.openejb.core.timer.TimerStore; @@ -167,6 +169,7 @@ import java.io.IOException; import java.io.InputStream; import java.lang.instrument.ClassFileTransformer; import java.lang.instrument.Instrumentation; +import java.lang.reflect.Constructor; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import java.net.MalformedURLException; @@ -204,6 +207,7 @@ public class Assembler extends Assembler public static final Logger logger = Logger.getInstance(LogCategory.OPENEJB_STARTUP, Assembler.class); public static final String OPENEJB_JPA_DEPLOY_TIME_ENHANCEMENT_PROP = "openejb.jpa.deploy-time-enhancement"; private static final String GLOBAL_UNIQUE_ID = "global"; + public static final String TIMER_STORE_CLASS = "timerStore.class"; Messages messages = new Messages(Assembler.class.getPackage().getName()); private final CoreContainerSystem containerSystem; @@ -860,7 +864,7 @@ public class Assembler extends Assembler final Collection<Scheduler> schedulers = new ArrayList<Scheduler>(); for (final BeanContext ejb : appContext.getBeanContexts()) { final Scheduler scheduler = ejb.get(Scheduler.class); - if (scheduler == null || scheduler == globalScheduler || schedulers.contains(scheduler)) { + if (scheduler == null || scheduler == globalScheduler || schedulers.contains(scheduler)) { continue; } @@ -940,7 +944,7 @@ public class Assembler extends Assembler } if (timerServiceRequired) { // Create the timer - final EjbTimerServiceImpl timerService = new EjbTimerServiceImpl(beanContext); + final EjbTimerServiceImpl timerService = new EjbTimerServiceImpl(beanContext, newTimerStore(beanContext)); //Load auto-start timers final TimerStore timerStore = timerService.getTimerStore(); for (Iterator<Map.Entry<Method, MethodContext>> it = beanContext.iteratorMethodContext(); it.hasNext(); ) { @@ -984,6 +988,29 @@ public class Assembler extends Assembler return ejbs; } + private static TimerStore newTimerStore(final BeanContext beanContext) { + for (final DeploymentContext context : Arrays.asList(beanContext, beanContext.getModuleContext(), beanContext.getModuleContext().getAppContext())) { + final String timerStoreClass = context.getProperties().getProperty(TIMER_STORE_CLASS); + if (timerStoreClass != null) { + logger.info("Found timer class: " + timerStoreClass); + + try { + final Class<?> clazz = beanContext.getClassLoader().loadClass(timerStoreClass); + try { + final Constructor<?> constructor = clazz.getConstructor(TransactionManager.class); + return TimerStore.class.cast(constructor.newInstance(EjbTimerServiceImpl.getDefaultTransactionManager())); + } catch (final Exception ignored) { + return TimerStore.class.cast(clazz.newInstance()); + } + } catch (final Exception e) { + logger.error("Can't instantiate " + timerStoreClass + ", using default memory timer store"); + } + } + } + + return new MemoryTimerStore(EjbTimerServiceImpl.getDefaultTransactionManager()); + } + public void startEjbs(final boolean start, final List<BeanContext> allDeployments) throws OpenEJBException { // now that everything is configured, deploy to the container if (start) { 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=1453433&r1=1453432&r2=1453433&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 Wed Mar 6 17:10:38 2013 @@ -88,8 +88,8 @@ public class EjbTimerServiceImpl impleme private transient TimerStore timerStore; private transient Scheduler scheduler = null; - public EjbTimerServiceImpl(final BeanContext deployment) { - this(deployment, getDefaultTransactionManager(), new MemoryTimerStore(getDefaultTransactionManager()), -1); + public EjbTimerServiceImpl(final BeanContext deployment, final TimerStore timerStore) { + this(deployment, getDefaultTransactionManager(), timerStore, -1); } public static TransactionManager getDefaultTransactionManager() {