Author: rmannibucau
Date: Sun Jul 15 16:47:19 2012
New Revision: 1361732
URL: http://svn.apache.org/viewvc?rev=1361732&view=rev
Log:
OPENEJB-1868 scheduler / ejb
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/RpcContainerWrapper.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/entity/EntityContainer.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java?rev=1361732&r1=1361731&r2=1361732&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/BeanContext.java
Sun Jul 15 16:47:19 2012
@@ -30,6 +30,7 @@ import org.apache.openejb.core.intercept
import org.apache.openejb.core.interceptor.InterceptorStack;
import org.apache.openejb.core.ivm.EjbHomeProxyHandler;
import org.apache.openejb.core.timer.EjbTimerService;
+import org.apache.openejb.core.timer.EjbTimerServiceImpl;
import org.apache.openejb.core.transaction.EjbTransactionUtil;
import org.apache.openejb.core.transaction.TransactionPolicy;
import org.apache.openejb.core.transaction.TransactionPolicyFactory;
@@ -1566,4 +1567,10 @@ public class BeanContext extends Deploym
public void setHidden(boolean hidden) {
this.hidden = hidden;
}
+
+ public void stop() {
+ if (ejbTimerService != null && ejbTimerService instanceof
EjbTimerServiceImpl) {
+ ((EjbTimerServiceImpl) ejbTimerService).shutdownMe();
+ }
+ }
}
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/RpcContainerWrapper.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/RpcContainerWrapper.java?rev=1361732&r1=1361731&r2=1361732&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/RpcContainerWrapper.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/RpcContainerWrapper.java
Sun Jul 15 16:47:19 2012
@@ -70,6 +70,7 @@ public class RpcContainerWrapper impleme
public void stop(BeanContext info) throws OpenEJBException {
container.stop(info);
+ info.stop();
}
public void undeploy(BeanContext info) throws OpenEJBException {
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java?rev=1361732&r1=1361731&r2=1361732&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/cmp/CmpContainer.java
Sun Jul 15 16:47:19 2012
@@ -183,6 +183,7 @@ public class CmpContainer implements Rpc
}
public void stop(BeanContext beanContext) throws OpenEJBException {
+ beanContext.stop();
}
public void undeploy(BeanContext beanContext) throws OpenEJBException {
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/entity/EntityContainer.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/entity/EntityContainer.java?rev=1361732&r1=1361731&r2=1361732&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/entity/EntityContainer.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/entity/EntityContainer.java
Sun Jul 15 16:47:19 2012
@@ -120,6 +120,7 @@ public class EntityContainer implements
}
public void stop(BeanContext info) throws OpenEJBException {
+ info.stop();
}
public void undeploy(BeanContext info) throws OpenEJBException {
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java?rev=1361732&r1=1361731&r2=1361732&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/managed/ManagedContainer.java
Sun Jul 15 16:47:19 2012
@@ -234,6 +234,7 @@ public class ManagedContainer implements
}
public void stop(BeanContext beanContext) throws OpenEJBException {
+ beanContext.stop();
}
public synchronized void undeploy(final BeanContext bean) throws
OpenEJBException {
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java?rev=1361732&r1=1361731&r2=1361732&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java
Sun Jul 15 16:47:19 2012
@@ -251,6 +251,7 @@ public class MdbContainer implements Rpc
}
public void stop(BeanContext info) throws OpenEJBException {
+ info.stop();
}
public void undeploy(BeanContext beanContext) throws OpenEJBException {
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java?rev=1361732&r1=1361731&r2=1361732&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonContainer.java
Sun Jul 15 16:47:19 2012
@@ -125,6 +125,7 @@ public class SingletonContainer implemen
@Override
public void stop(BeanContext info) throws OpenEJBException {
+ info.stop();
}
@Override
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java?rev=1361732&r1=1361731&r2=1361732&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateful/StatefulContainer.java
Sun Jul 15 16:47:19 2012
@@ -251,6 +251,7 @@ public class StatefulContainer implement
}
public void stop(BeanContext beanContext) throws OpenEJBException {
+ beanContext.stop();
}
public synchronized void undeploy(final BeanContext beanContext) throws
OpenEJBException {
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java?rev=1361732&r1=1361731&r2=1361732&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessContainer.java
Sun Jul 15 16:47:19 2012
@@ -112,6 +112,7 @@ public class StatelessContainer implemen
}
public void stop(BeanContext beanContext) throws OpenEJBException {
+ beanContext.stop();
}
public void undeploy(BeanContext beanContext) {
Modified:
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java?rev=1361732&r1=1361731&r2=1361732&view=diff
==============================================================================
---
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
(original)
+++
openejb/trunk/openejb/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
Sun Jul 15 16:47:19 2012
@@ -27,14 +27,24 @@ import org.apache.openejb.loader.SystemI
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
import org.apache.openejb.util.SetAccessible;
+import org.quartz.Calendar;
import org.quartz.JobBuilder;
import org.quartz.JobDataMap;
import org.quartz.JobDetail;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobKey;
+import org.quartz.ListenerManager;
import org.quartz.Scheduler;
+import org.quartz.SchedulerContext;
import org.quartz.SchedulerException;
+import org.quartz.SchedulerMetaData;
import org.quartz.Trigger;
+import org.quartz.TriggerKey;
+import org.quartz.UnableToInterruptJobException;
import org.quartz.impl.StdSchedulerFactory;
+import org.quartz.impl.matchers.GroupMatcher;
import org.quartz.impl.triggers.AbstractTrigger;
+import org.quartz.spi.JobFactory;
import javax.ejb.EJBContext;
import javax.ejb.EJBException;
@@ -50,7 +60,10 @@ import java.lang.reflect.Modifier;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
+import java.util.List;
+import java.util.Map;
import java.util.Properties;
+import java.util.Set;
public class EjbTimerServiceImpl implements EjbTimerService {
@@ -60,6 +73,24 @@ public class EjbTimerServiceImpl impleme
public static final String OPENEJB_TIMEOUT_JOB_NAME =
"OPENEJB_TIMEOUT_JOB";
public static final String OPENEJB_TIMEOUT_JOB_GROUP_NAME =
"OPENEJB_TIMEOUT_GROUP";
+
+ private static final String[] CONFIG_PROPERTIES;
+ static {
+ final List<String> values = new ArrayList<String>();
+ for (Field field : StdSchedulerFactory.class.getDeclaredFields()) {
+ int mods = field.getModifiers();
+ if (Modifier.isStatic(mods) && Modifier.isFinal(mods) &&
Modifier.isPublic(mods)
+ && String.class.equals(field.getType())) {
+ try {
+ values.add((String) field.get(null));
+ } catch (IllegalAccessException e) {
+ // ignored
+ }
+ }
+ }
+ CONFIG_PROPERTIES = values.toArray(new String[values.size()]);
+ }
+
private final TransactionManager transactionManager;
final BeanContext deployment;
private final boolean transacted;
@@ -70,7 +101,7 @@ public class EjbTimerServiceImpl impleme
private Scheduler scheduler;
public EjbTimerServiceImpl(BeanContext deployment) {
- this(deployment, getDefaultTransactionManager(),
getDefaultScheduler(), new MemoryTimerStore(getDefaultTransactionManager()), 1);
+ this(deployment, getDefaultTransactionManager(),
getDefaultScheduler(deployment), new
MemoryTimerStore(getDefaultTransactionManager()), 1);
}
public static TransactionManager getDefaultTransactionManager() {
@@ -87,29 +118,22 @@ public class EjbTimerServiceImpl impleme
this.retryAttempts = retryAttempts;
}
- public static synchronized Scheduler getDefaultScheduler() {
- Scheduler scheduler =
SystemInstance.get().getComponent(Scheduler.class);
- if (scheduler == null) {
- Properties properties = new Properties();
- properties.put(StdSchedulerFactory.PROP_THREAD_POOL_CLASS,
SystemInstance.get().hasProperty(QUARTZ_THREAD_POOL_ADAPTER) ?
SystemInstance.get().getOptions().get(QUARTZ_THREAD_POOL_ADAPTER, "")
- : DefaultTimerThreadPoolAdapter.class.getName());
- properties.put(StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME,
"OpenEJB-TimerService-Scheduler");
- for (Field field : StdSchedulerFactory.class.getDeclaredFields()) {
- int mods = field.getModifiers();
- if (Modifier.isStatic(mods) && Modifier.isFinal(mods) &&
Modifier.isPublic(mods)
- && String.class.equals(field.getType())) {
- try {
- final String key = (String) field.get(null);
- final String value =
SystemInstance.get().getOptions().get(key, (String) null);
- properties.setProperty(key, value);
- } catch (IllegalAccessException e) {
- // ignored
- }
- }
- }
+ public static synchronized Scheduler getDefaultScheduler(BeanContext
deployment) {
+ final Properties properties = new Properties();
+ properties.put(StdSchedulerFactory.PROP_THREAD_POOL_CLASS,
SystemInstance.get().hasProperty(QUARTZ_THREAD_POOL_ADAPTER) ?
SystemInstance.get().getOptions().get(QUARTZ_THREAD_POOL_ADAPTER, "")
+ : DefaultTimerThreadPoolAdapter.class.getName());
+ properties.put(StdSchedulerFactory.PROP_SCHED_INSTANCE_NAME,
"OpenEJB-TimerService-Scheduler");
+ updateProperties(properties, null);
+
+ boolean newInstance = updateProperties(properties,
deployment.getEjbName())
+ || updateProperties(properties, deployment.getModuleName() +
"." + deployment.getEjbName());
+
+ final Scheduler scheduler =
SystemInstance.get().getComponent(Scheduler.class);
+ Scheduler thisScheduler;
+ if (scheduler == null || newInstance) {
try {
- scheduler = new StdSchedulerFactory(properties).getScheduler();
- scheduler.start();
+ thisScheduler = new
StdSchedulerFactory(properties).getScheduler();
+ thisScheduler.start();
//durability is configured with true, which means that the job
will be kept in the store even if no trigger is attached to it.
//Currently, all the EJB beans share with the same job instance
JobDetail job = JobBuilder.newJob(EjbTimeoutJob.class)
@@ -117,13 +141,48 @@ public class EjbTimerServiceImpl impleme
.storeDurably(true)
.requestRecovery(false)
.build();
- scheduler.addJob(job, true);
+ thisScheduler.addJob(job, true);
} catch (SchedulerException e) {
throw new OpenEJBRuntimeException("Fail to initialize the
default scheduler", e);
}
- SystemInstance.get().setComponent(Scheduler.class, scheduler);
+
+ if (!newInstance) {
+ SystemInstance.get().setComponent(Scheduler.class,
thisScheduler);
+ }
+ } else {
+ thisScheduler = scheduler;
+ }
+ return thisScheduler;
+ }
+
+ private static boolean updateProperties(final Properties properties, final
String prefix) {
+ boolean updated = false;
+ for (String key: CONFIG_PROPERTIES) {
+ final String newKey;
+ if (prefix == null || prefix.isEmpty()) {
+ newKey = key;
+ } else {
+ newKey = prefix + "." + key;
+ }
+
+ final String value = SystemInstance.get().getOptions().get(newKey,
(String) null);
+ if (value != null) {
+ properties.setProperty(key, value);
+ updated = true;
+ }
+ }
+ return updated;
+ }
+
+ public void shutdownMe() {
+ // if specific instance
+ if (scheduler != null && scheduler !=
SystemInstance.get().getComponent(Scheduler.class)) {
+ try {
+ scheduler.shutdown();
+ } catch (SchedulerException e) {
+ throw new OpenEJBRuntimeException("Unable to shutdown
scheduler", e);
+ }
}
- return scheduler;
}
public static void shutdown() {