Author: xuhaihong
Date: Fri Mar 25 02:49:42 2011
New Revision: 1085242
URL: http://svn.apache.org/viewvc?rev=1085242&view=rev
Log:
OPENEJB-1451 TimerService should be only binded to singleton/stateless/MDB.
(Patch from Shawn Jiang)
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonInstanceManager.java
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java?rev=1085242&r1=1085241&r2=1085242&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/JndiEncBuilder.java
Fri Mar 25 02:49:42 2011
@@ -44,7 +44,6 @@ import org.apache.openejb.util.Classes;
import org.apache.openejb.util.IntrospectionSupport;
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
-import org.apache.openejb.core.timer.TimerServiceWrapper;
import org.omg.CORBA.ORB;
import javax.annotation.ManagedBean;
@@ -86,14 +85,14 @@ public class JndiEncBuilder {
app,
global,
}
-
+
private final boolean beanManagedTransactions;
private final JndiEncInfo jndiEnc;
private final URI moduleUri;
private final List<Injection> injections;
private final ClassLoader classLoader;
private final AppContext appContext;
-
+
private boolean useCrossClassLoaderRef = true;
private boolean client = false;
@@ -151,15 +150,15 @@ public class JndiEncBuilder {
break;
case global:
addSpecialGlobalBindings(bindings);
- break;
+ break;
}
return jndiFactory.createComponentContext(bindings);
}
-
+
public Map<String, Object> buildMap() throws OpenEJBException {
Map<String, Object> bindings = new HashMap<String, Object>();
-
+
// get JtaEntityManagerRegistry
JtaEntityManagerRegistry jtaEntityManagerRegistry =
SystemInstance.get().getComponent(JtaEntityManagerRegistry.class);
@@ -203,7 +202,7 @@ public class JndiEncBuilder {
bindings.put(normalize(entry.referenceName), reference);
continue;
}
-
+
try {
Class type = Classes.deprimitivize(getType(entry.type, entry));
Object obj = null;
@@ -245,18 +244,18 @@ public class JndiEncBuilder {
}
for (ResourceReferenceInfo referenceInfo : jndiEnc.resourceRefs) {
-
+
if (referenceInfo.location != null) {
Reference reference =
buildReferenceLocation(referenceInfo.location);
bindings.put(normalize(referenceInfo.referenceName),
reference);
continue;
}
-
+
Class<?> type = getType(referenceInfo.referenceType,
referenceInfo);
-
+
Object reference = null;
if (URL.class.equals(type)) {
- reference = new URLReference(referenceInfo.resourceID);
+ reference = new URLReference(referenceInfo.resourceID);
} else if (type.isAnnotationPresent(ManagedBean.class)) {
ManagedBean managed = type.getAnnotation(ManagedBean.class);
String name = managed.value().length() == 0 ?
type.getSimpleName() : managed.value();
@@ -272,15 +271,15 @@ public class JndiEncBuilder {
}
for (ResourceEnvReferenceInfo referenceInfo : jndiEnc.resourceEnvRefs)
{
-
+
if (referenceInfo.location != null) {
Reference reference =
buildReferenceLocation(referenceInfo.location);
bindings.put(normalize(referenceInfo.referenceName),
reference);
continue;
}
-
+
Class<?> type = getType(referenceInfo.resourceEnvRefType,
referenceInfo);
-
+
Object reference = null;
if (EJBContext.class.isAssignableFrom(type)) {
String jndiName = "comp/EJBContext";
@@ -439,11 +438,6 @@ public class JndiEncBuilder {
userTransaction = new CoreUserTransaction(transactionManager);
bindings.put("comp/UserTransaction", userTransaction);
}
-
- // bind TimerService
- if (!isClient()) {
- bindings.put("comp/TimerService", new TimerServiceWrapper());
- }
}
private void addSpecialModuleBindings(Map<String, Object> bindings) {
@@ -455,7 +449,7 @@ public class JndiEncBuilder {
bindings.put("module/dummy", "dummy");
}
}
-
+
private void addSpecialAppBindings(Map<String, Object> bindings) {
if (moduleUri != null) {
bindings.put("app/AppName", moduleUri.toString());
@@ -465,14 +459,14 @@ public class JndiEncBuilder {
bindings.put("app/dummy", "dummy");
}
}
-
+
private void addSpecialGlobalBindings(Map<String, Object> bindings) {
// ensure the bindings will be non-empty
if (bindings.isEmpty()) {
bindings.put("global/dummy", "dummy");
}
}
-
+
public static boolean bindingExists(Context context, Name contextName) {
try {
return context.lookup(contextName) != null;
@@ -503,9 +497,9 @@ public class JndiEncBuilder {
throw new OpenEJBException("Unable to load type '" + type + "'
for " + injectable.referenceName);
}
}
- return inferType(injectable);
+ return inferType(injectable);
}
-
+
private Class inferType(InjectableInfo injectable) throws OpenEJBException
{
for (InjectionInfo injection : injectable.targets) {
try {
@@ -520,7 +514,7 @@ public class JndiEncBuilder {
}
throw new OpenEJBException("Unable to infer type for " +
injectable.referenceName);
}
-
+
private static class Ref implements EjbResolver.Reference, Serializable {
private final EjbReferenceInfo info;
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java?rev=1085242&r1=1085241&r2=1085242&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java
Fri Mar 25 02:49:42 2011
@@ -17,6 +17,17 @@
*/
package org.apache.openejb.core.mdb;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+
+import javax.ejb.EJBContext;
+import javax.ejb.MessageDrivenBean;
+import javax.naming.Context;
+import javax.naming.NamingException;
+import javax.resource.spi.UnavailableException;
+
import org.apache.openejb.BeanContext;
import org.apache.openejb.OpenEJBException;
import org.apache.openejb.core.BaseContext;
@@ -25,20 +36,11 @@ import org.apache.openejb.core.Operation
import org.apache.openejb.core.ThreadContext;
import org.apache.openejb.core.interceptor.InterceptorData;
import org.apache.openejb.core.interceptor.InterceptorStack;
+import org.apache.openejb.core.timer.TimerServiceWrapper;
import org.apache.openejb.spi.SecurityService;
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
-import javax.ejb.EJBContext;
-import javax.ejb.MessageDrivenBean;
-import javax.naming.Context;
-import javax.naming.NamingException;
-import javax.resource.spi.UnavailableException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-
/**
* A MdbInstanceFactory creates instances of message driven beans for a single
instance. This class differs from other
* instance managers in OpenEJB as it doesn't do pooling and it creates
instances for only a single EJB deployment.
@@ -75,8 +77,9 @@ public class MdbInstanceFactory {
try {
final Context context = beanContext.getJndiEnc();
context.bind("comp/EJBContext", mdbContext);
+ context.bind("comp/TimerService", new TimerServiceWrapper());
} catch (NamingException e) {
- throw new OpenEJBException("Failed to bind EJBContext", e);
+ throw new OpenEJBException("Failed to bind
EJBContext/TimerService", e);
}
beanContext.set(EJBContext.class, this.mdbContext);
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonInstanceManager.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonInstanceManager.java?rev=1085242&r1=1085241&r2=1085242&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonInstanceManager.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/singleton/SingletonInstanceManager.java
Fri Mar 25 02:49:42 2011
@@ -16,48 +16,49 @@
*/
package org.apache.openejb.core.singleton;
-import java.lang.reflect.Method;
import java.lang.management.ManagementFactory;
+import java.lang.reflect.Method;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
-import java.util.concurrent.locks.ReentrantReadWriteLock;
-import java.util.concurrent.locks.ReadWriteLock;
-import java.util.concurrent.locks.Lock;
-import java.util.concurrent.locks.Condition;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.Future;
-import java.util.concurrent.FutureTask;
import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
+import java.util.concurrent.FutureTask;
+import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.locks.Condition;
+import java.util.concurrent.locks.Lock;
+import java.util.concurrent.locks.ReadWriteLock;
+import java.util.concurrent.locks.ReentrantReadWriteLock;
import javax.ejb.EJBContext;
-import javax.ejb.SessionBean;
import javax.ejb.NoSuchEJBException;
+import javax.ejb.SessionBean;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
import javax.naming.Context;
import javax.naming.NamingException;
import javax.xml.ws.WebServiceContext;
-import javax.management.MBeanServer;
-import javax.management.ObjectName;
+import org.apache.openejb.ApplicationException;
import org.apache.openejb.BeanContext;
import org.apache.openejb.BeanType;
import org.apache.openejb.OpenEJBException;
-import org.apache.openejb.ApplicationException;
-import org.apache.openejb.core.transaction.TransactionType;
-import org.apache.openejb.loader.SystemInstance;
-import org.apache.openejb.monitoring.StatsInterceptor;
-import org.apache.openejb.monitoring.ObjectNameBuilder;
-import org.apache.openejb.monitoring.ManagedMBean;
+import org.apache.openejb.core.InstanceContext;
import org.apache.openejb.core.Operation;
import org.apache.openejb.core.ThreadContext;
-import org.apache.openejb.core.InstanceContext;
import org.apache.openejb.core.interceptor.InterceptorData;
import org.apache.openejb.core.interceptor.InterceptorStack;
+import org.apache.openejb.core.timer.TimerServiceWrapper;
import org.apache.openejb.core.transaction.EjbTransactionUtil;
import org.apache.openejb.core.transaction.TransactionPolicy;
+import org.apache.openejb.core.transaction.TransactionType;
+import org.apache.openejb.loader.SystemInstance;
+import org.apache.openejb.monitoring.ManagedMBean;
+import org.apache.openejb.monitoring.ObjectNameBuilder;
+import org.apache.openejb.monitoring.StatsInterceptor;
import org.apache.openejb.spi.ContainerSystem;
import org.apache.openejb.spi.SecurityService;
import org.apache.openejb.util.LogCategory;
@@ -111,7 +112,7 @@ public class SingletonInstanceManager {
// We will construct this FutureTask and compete with the
// other threads for the right to create the singleton
FutureTask<Instance> task = new FutureTask<Instance>(new
Callable<Instance>() {
- public Instance call() throws Exception {
+ public Instance call() throws Exception {
return createInstance(callContext, beanContext);
}
});
@@ -166,11 +167,11 @@ public class SingletonInstanceManager {
}
}
}
-
+
private Instance createInstance(ThreadContext callContext, BeanContext
beanContext) throws ApplicationException {
try {
initializeDependencies(beanContext);
-
+
final InstanceContext context = beanContext.newInstance();
if (context.getBean() instanceof SessionBean){
@@ -254,7 +255,7 @@ public class SingletonInstanceManager {
TransactionPolicy transactionPolicy =
EjbTransactionUtil.createTransactionPolicy(transactionType, callContext);
try{
//Call the chain
- interceptorStack.invoke();
+ interceptorStack.invoke();
} catch(Throwable e) {
//RollBack Transaction
EjbTransactionUtil.handleSystemException(transactionPolicy, e,
callContext);
@@ -267,7 +268,7 @@ public class SingletonInstanceManager {
logger.error("Singleton shutdown failed:
"+beanContext.getDeploymentID(), re);
}
}
-
+
/**
* This method has no work to do as all instances are removed from
* the pool on getInstance(...) and not returned via poolInstance(...)
@@ -313,8 +314,9 @@ public class SingletonInstanceManager {
final Context context = beanContext.getJndiEnc();
context.bind("comp/EJBContext", sessionContext);
context.bind("comp/WebServiceContext", webServiceContext);
+ context.bind("comp/TimerService", new TimerServiceWrapper());
} catch (NamingException e) {
- throw new OpenEJBException("Failed to bind EJBContext", e);
+ throw new OpenEJBException("Failed to bind
EJBContext/WebServiceContext/TimerService", e);
}
}
Modified:
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java
URL:
http://svn.apache.org/viewvc/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java?rev=1085242&r1=1085241&r2=1085242&view=diff
==============================================================================
---
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java
(original)
+++
openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/stateless/StatelessInstanceManager.java
Fri Mar 25 02:49:42 2011
@@ -16,51 +16,52 @@
*/
package org.apache.openejb.core.stateless;
-import java.lang.reflect.Method;
-import java.lang.reflect.InvocationTargetException;
+import java.io.Flushable;
+import java.io.IOException;
import java.lang.management.ManagementFactory;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
import java.rmi.RemoteException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
+import java.util.concurrent.Executor;
+import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadFactory;
-import java.util.concurrent.TimeoutException;
-import java.util.concurrent.TimeUnit;
import java.util.concurrent.ThreadPoolExecutor;
-import java.util.concurrent.LinkedBlockingQueue;
-import java.util.concurrent.Executor;
-import java.io.Flushable;
-import java.io.IOException;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
+import javax.ejb.ConcurrentAccessTimeoutException;
import javax.ejb.EJBContext;
import javax.ejb.SessionBean;
import javax.ejb.SessionContext;
-import javax.ejb.ConcurrentAccessTimeoutException;
+import javax.management.MBeanServer;
+import javax.management.ObjectName;
import javax.naming.Context;
import javax.naming.NamingException;
-import javax.management.ObjectName;
-import javax.management.MBeanServer;
+import org.apache.openejb.ApplicationException;
import org.apache.openejb.BeanContext;
import org.apache.openejb.OpenEJBException;
import org.apache.openejb.SystemException;
-import org.apache.openejb.ApplicationException;
-import org.apache.openejb.monitoring.StatsInterceptor;
-import org.apache.openejb.monitoring.ObjectNameBuilder;
-import org.apache.openejb.monitoring.ManagedMBean;
-import org.apache.openejb.loader.Options;
+import org.apache.openejb.core.InstanceContext;
import org.apache.openejb.core.Operation;
import org.apache.openejb.core.ThreadContext;
-import org.apache.openejb.core.InstanceContext;
import org.apache.openejb.core.interceptor.InterceptorData;
import org.apache.openejb.core.interceptor.InterceptorStack;
+import org.apache.openejb.core.timer.TimerServiceWrapper;
+import org.apache.openejb.loader.Options;
+import org.apache.openejb.monitoring.ManagedMBean;
+import org.apache.openejb.monitoring.ObjectNameBuilder;
+import org.apache.openejb.monitoring.StatsInterceptor;
import org.apache.openejb.spi.SecurityService;
import org.apache.openejb.util.Duration;
import org.apache.openejb.util.LogCategory;
import org.apache.openejb.util.Logger;
-import org.apache.openejb.util.SafeToolkit;
-import org.apache.openejb.util.Pool;
import org.apache.openejb.util.PassthroughFactory;
+import org.apache.openejb.util.Pool;
+import org.apache.openejb.util.SafeToolkit;
import org.apache.xbean.recipe.ObjectRecipe;
import org.apache.xbean.recipe.Option;
@@ -81,7 +82,7 @@ public class StatelessInstanceManager {
this.accessTimeout = accessTimeout;
this.closeTimeout = closeTimeout;
this.poolBuilder = poolBuilder;
-
+
if (accessTimeout.getUnit() == null)
accessTimeout.setUnit(TimeUnit.MILLISECONDS);
executor = new ThreadPoolExecutor(callbackThreads, callbackThreads*2,
@@ -138,7 +139,7 @@ public class StatelessInstanceManager {
* If StrictPooling is not enabled this method will create a
* new stateless bean instance performing all required injection
* and callbacks before returning it in a method ready state.
- *
+ *
* @param callContext
* @return
* @throws OpenEJBException
@@ -229,11 +230,11 @@ public class StatelessInstanceManager {
pool.push(instance);
}
}
-
+
/**
- * This method is called to release the semaphore in case of the business
method
+ * This method is called to release the semaphore in case of the business
method
* throwing a system exception
- *
+ *
* @param callContext
* @param bean
*/
@@ -298,8 +299,9 @@ public class StatelessInstanceManager {
final Context context = beanContext.getJndiEnc();
context.bind("comp/EJBContext", data.sessionContext);
context.bind("comp/WebServiceContext", new
EjbWsContext(data.sessionContext));
+ context.bind("comp/TimerService", new TimerServiceWrapper());
} catch (NamingException e) {
- throw new OpenEJBException("Failed to bind EJBContext", e);
+ throw new OpenEJBException("Failed to bind
EJBContext/WebServiceContext/TimerService", e);
}
final int min = builder.getMin();