Author: dain
Date: Thu May 31 19:26:25 2007
New Revision: 543360
URL: http://svn.apache.org/viewvc?view=rev&rev=543360
Log:
Enable container managed transaction attributes for ejbTimeout
Enable timer for message driven beans
Modified:
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
Modified:
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
URL:
http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java?view=diff&rev=543360&r1=543359&r2=543360
==============================================================================
---
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
(original)
+++
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/Assembler.java
Thu May 31 19:26:25 2007
@@ -25,6 +25,7 @@
import org.apache.openejb.OpenEJB;
import org.apache.openejb.OpenEJBException;
import org.apache.openejb.UndeployException;
+import org.apache.openejb.BeanType;
import org.apache.openejb.resource.jdbc.JdbcManagedConnectionFactory;
import org.apache.openejb.resource.GeronimoConnectionManagerFactory;
import org.apache.openejb.core.ConnectorReference;
@@ -32,6 +33,8 @@
import org.apache.openejb.core.CoreDeploymentInfo;
import org.apache.openejb.core.SimpleTransactionSynchronizationRegistry;
import org.apache.openejb.core.TemporaryClassLoader;
+import org.apache.openejb.core.timer.EjbTimerServiceImpl;
+import org.apache.openejb.core.timer.NullEjbTimerServiceImpl;
import org.apache.openejb.core.ivm.naming.IvmContext;
import org.apache.openejb.javaagent.Agent;
import org.apache.openejb.loader.SystemInstance;
@@ -68,6 +71,7 @@
import java.io.IOException;
import java.lang.instrument.ClassFileTransformer;
import java.lang.instrument.Instrumentation;
+import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLClassLoader;
@@ -408,6 +412,7 @@
jaccPermissionsBuilder.install(policyContext);
}
+ // process transaction attributes
for (DeploymentInfo deploymentInfo : deployments.values()) {
applyTransactionAttributes((CoreDeploymentInfo)
deploymentInfo, ejbJar.methodTransactions);
containerSystem.addDeployment(deploymentInfo);
@@ -415,6 +420,25 @@
}
+ // setup timers - must be after transaction attibutes are set
+ for (DeploymentInfo deploymentInfo : deployments.values()) {
+ CoreDeploymentInfo coreDeploymentInfo =
(CoreDeploymentInfo) deploymentInfo;
+ if (coreDeploymentInfo.getComponentType() !=
BeanType.STATEFUL) {
+ Method ejbTimeout = coreDeploymentInfo.getEjbTimeout();
+ if (ejbTimeout != null) {
+ // If user set the tx attribute to RequiresNew
change it to Required so a new transaction is not started
+ if
(coreDeploymentInfo.getTransactionAttribute(ejbTimeout) ==
CoreDeploymentInfo.TX_REQUIRES_NEW) {
+
coreDeploymentInfo.setMethodTransactionAttribute(ejbTimeout, "Required");
+ }
+
+ // Create the timer
+ EjbTimerServiceImpl timerService = new
EjbTimerServiceImpl(coreDeploymentInfo);
+
coreDeploymentInfo.setEjbTimerService(timerService);
+ } else {
+ coreDeploymentInfo.setEjbTimerService(new
NullEjbTimerServiceImpl());
+ }
+ }
+ }
// process application exceptions
for (ApplicationExceptionInfo exceptionInfo :
ejbJar.applicationException) {
try {
Modified:
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java
URL:
http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java?view=diff&rev=543360&r1=543359&r2=543360
==============================================================================
---
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java
(original)
+++
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/AssemblerTool.java
Thu May 31 19:26:25 2007
@@ -66,6 +66,7 @@
List<Method> methods = new ArrayList<Method>();
if (methodInfo.methodIntf == null) {
+ resolveMethods(methods,
deploymentInfo.getBeanClass(), methodInfo);
if (deploymentInfo.getRemoteInterface() != null) {
resolveMethods(methods,
deploymentInfo.getRemoteInterface(), methodInfo);
}
Modified:
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
URL:
http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java?view=diff&rev=543360&r1=543359&r2=543360
==============================================================================
---
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
(original)
+++
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/assembler/classic/EnterpriseBeanBuilder.java
Thu May 31 19:26:25 2007
@@ -211,18 +211,8 @@
}
}
- // Timer
+ // ejbTimeout
deployment.setEjbTimeout(getTimeout(ejbClass, bean.timeoutMethod));
-
- // This is a change in behavor from OpenEJB 2.x, which required an
ejbTimeout method
- if (!(bean instanceof StatefulBeanInfo)) {
- if (deployment.getEjbTimeout() != null) {
- EjbTimerServiceImpl timerService = new
EjbTimerServiceImpl(deployment);
- deployment.setEjbTimerService(timerService);
- } else {
- deployment.setEjbTimerService(new NullEjbTimerServiceImpl());
- }
- }
if (bean instanceof StatefulBeanInfo) {
StatefulBeanInfo statefulBeanInfo = (StatefulBeanInfo) bean;
@@ -367,7 +357,7 @@
Method timeout = null;
try {
if (TimedObject.class.isAssignableFrom(ejbClass)) {
- timeout = TimedObject.class.getMethod("ejbTimeout",
Timer.class);
+ timeout = ejbClass.getMethod("ejbTimeout", Timer.class);
} else if (info.methodParams != null) {
timeout = toMethod(ejbClass, info);
}
Modified:
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java
URL:
http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java?view=diff&rev=543360&r1=543359&r2=543360
==============================================================================
---
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java
(original)
+++
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbContainer.java
Thu May 31 19:26:25 2007
@@ -27,6 +27,7 @@
import org.apache.openejb.core.CoreDeploymentInfo;
import org.apache.openejb.core.Operation;
import org.apache.openejb.core.ThreadContext;
+import org.apache.openejb.core.timer.EjbTimerService;
import org.apache.openejb.core.interceptor.InterceptorData;
import org.apache.openejb.core.interceptor.InterceptorStack;
import org.apache.openejb.core.transaction.TransactionContainer;
@@ -127,6 +128,12 @@
throw new OpenEJBException(e);
}
+
+ // start the timer service
+ EjbTimerService timerService = deploymentInfo.getEjbTimerService();
+ if (timerService != null) {
+ timerService.start();
+ }
}
private ActivationSpec createActivationSpec(DeploymentInfo
deploymentInfo)throws OpenEJBException {
@@ -196,7 +203,25 @@
}
public Object invoke(Object deploymentId, Class callInterface, Method
method, Object[] args, Object primKey) throws OpenEJBException {
- throw new OpenEJBException("This MdbContainer.invoke should not be
used!");
+ CoreDeploymentInfo deploymentInfo = (CoreDeploymentInfo)
getDeploymentInfo(deploymentId);
+
+ EndpointFactory endpointFactory = (EndpointFactory)
deploymentInfo.getContainerData();
+ MdbInstanceFactory instanceFactory =
endpointFactory.getInstanceFactory();
+ Instance instance = null;
+ try {
+ instance = (Instance) instanceFactory.createInstance(true);
+ } catch (UnavailableException e) {
+ throw new SystemException("Unable to create instance for
invocation", e);
+ }
+
+ try {
+ beforeDelivery(deploymentInfo, instance, method, null);
+ Object value = invoke(instance, method, args);
+ afterDelivery(instance);
+ return value;
+ } finally {
+ instanceFactory.freeInstance(instance, true);
+ }
}
public void beforeDelivery(CoreDeploymentInfo deployInfo, Object instance,
Method method, XAResource xaResource) throws SystemException {
Modified:
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java
URL:
http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java?view=diff&rev=543360&r1=543359&r2=543360
==============================================================================
---
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java
(original)
+++
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/mdb/MdbInstanceFactory.java
Thu May 31 19:26:25 2007
@@ -130,7 +130,7 @@
* Frees an instance no longer needed by the resource adapter. This
method makes all the necessary lifecycle
* callbacks and decrements the instance count. This method should not be
used to disposed of beans that have
* thrown a system exception. Instead the discardInstance method should
be called.
- * @param bean the bean instance to free
+ * @param instance the bean instance to free
* @param ignoredInstanceCount
*/
public void freeInstance(Instance instance, boolean ignoredInstanceCount) {
Modified:
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
URL:
http://svn.apache.org/viewvc/incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java?view=diff&rev=543360&r1=543359&r2=543360
==============================================================================
---
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
(original)
+++
incubator/openejb/trunk/openejb3/container/openejb-core/src/main/java/org/apache/openejb/core/timer/EjbTimerServiceImpl.java
Thu May 31 19:26:25 2007
@@ -265,7 +265,7 @@
return;
}
- for (int tries = 0; tries < retryAttempts; tries++) {
+ for (int tries = 0; tries < (1 + retryAttempts); tries++) {
// if transacted, begin the transaction
if (transacted) {
try {