Permalink
Comparing changes
Open a pull request
- 2 commits
- 3 files changed
- 0 commit comments
- 2 contributors
Commits on Apr 15, 2019
Unified
Split
Showing
with
59 additions
and 10 deletions.
- +6 −10 ejb3/src/main/java/org/jboss/as/ejb3/tx/BMTInterceptor.java
- +25 −0 ...test/java/org/jboss/as/test/integration/ejb/transaction/bmt/timeout/StatelessTimeoutTestCase.java
- +28 −0 ...st/java/org/jboss/as/test/integration/ejb/transaction/cmt/timeout/TransactionTimeoutTestCase.java
| @@ -24,12 +24,11 @@ | ||
| import javax.ejb.EJBException; | ||
| import javax.transaction.SystemException; | ||
| import javax.transaction.Transaction; | ||
| import javax.transaction.TransactionManager; | ||
|
|
||
| import org.jboss.as.ejb3.component.EJBComponent; | ||
| import org.jboss.invocation.Interceptor; | ||
| import org.jboss.invocation.InterceptorContext; | ||
| import org.jboss.tm.TransactionTimeoutConfiguration; | ||
| import org.wildfly.transaction.client.ContextTransactionManager; | ||
|
|
||
| /** | ||
| * Suspend an incoming tx. | ||
| @@ -50,8 +49,8 @@ public BMTInterceptor(final EJBComponent component) { | ||
|
|
||
| @Override | ||
| public Object processInvocation(final InterceptorContext context) throws Exception { | ||
| TransactionManager tm = component.getTransactionManager(); | ||
| int oldTimeout = getCurrentTransactionTimeout(component); | ||
| final ContextTransactionManager tm = ContextTransactionManager.getInstance(); | ||
| final int oldTimeout = tm.getTransactionTimeout(); | ||
| try { | ||
| Transaction oldTx = tm.suspend(); | ||
| try { | ||
| @@ -60,7 +59,8 @@ public Object processInvocation(final InterceptorContext context) throws Excepti | ||
| if (oldTx != null) tm.resume(oldTx); | ||
| } | ||
| } finally { | ||
| tm.setTransactionTimeout(oldTimeout == -1 ? 0 : oldTimeout); | ||
| // See also https://issues.jboss.org/browse/WFTC-44 | ||
| tm.setTransactionTimeout(oldTimeout == ContextTransactionManager.getGlobalDefaultTransactionTimeout() ? 0 : oldTimeout); | ||
| } | ||
| } | ||
|
|
||
| @@ -87,11 +87,7 @@ protected Exception handleException(final InterceptorContext invocation, Throwab | ||
| } | ||
|
|
||
| protected int getCurrentTransactionTimeout(final EJBComponent component) throws SystemException { | ||
| final TransactionManager tm = component.getTransactionManager(); | ||
| if (tm instanceof TransactionTimeoutConfiguration) { | ||
| return ((TransactionTimeoutConfiguration) tm).getTransactionTimeout(); | ||
| } | ||
| return 0; | ||
| return ContextTransactionManager.getInstance().getTransactionTimeout(); | ||
| } | ||
|
|
||
| public EJBComponent getComponent() { | ||
| @@ -39,10 +39,13 @@ | ||
| import org.junit.Before; | ||
| import org.junit.Test; | ||
| import org.junit.runner.RunWith; | ||
| import org.wildfly.transaction.client.ContextTransactionManager; | ||
|
|
||
| import java.util.PropertyPermission; | ||
| import javax.inject.Inject; | ||
| import javax.naming.InitialContext; | ||
| import javax.naming.NamingException; | ||
| import javax.transaction.TransactionManager; | ||
|
|
||
| /** | ||
| * BMT test where transaction timeout is involved. | ||
| @@ -126,4 +129,26 @@ public void resetTimeoutToDefault() throws Exception { | ||
| bean.test(); | ||
| } | ||
|
|
||
| @Test | ||
| public void threadStoringTimeout() throws Exception { | ||
| StatelessBmtBean bean = TransactionTestLookupUtil.lookupModule(initCtx, StatelessBmtBean.class); | ||
| TransactionManager tm = (TransactionManager) new InitialContext().lookup("java:/TransactionManager"); | ||
|
|
||
| int transactionTimeoutToSet = 42; | ||
| tm.setTransactionTimeout(transactionTimeoutToSet); | ||
| Assert.assertEquals("Expecting transaction timeout has to be the same as it was written by setter", | ||
| transactionTimeoutToSet, getTransactionTimeout(tm)); | ||
|
|
||
| bean.testTransaction(0, 0); | ||
|
|
||
| Assert.assertEquals("The transaction timeout has to be the same as before BMT call", | ||
| transactionTimeoutToSet, getTransactionTimeout(tm)); | ||
| } | ||
|
|
||
| private int getTransactionTimeout(TransactionManager tmTimeout) { | ||
| if (tmTimeout instanceof ContextTransactionManager) { | ||
| return ((ContextTransactionManager) tmTimeout).getTransactionTimeout(); | ||
| } | ||
| throw new IllegalStateException("Cannot get transaction timeout"); | ||
| } | ||
| } | ||
| @@ -22,7 +22,10 @@ | ||
| package org.jboss.as.test.integration.ejb.transaction.cmt.timeout; | ||
|
|
||
| import static org.junit.Assert.assertEquals; | ||
|
|
||
| import javax.naming.InitialContext; | ||
| import javax.transaction.TransactionManager; | ||
|
|
||
| import org.jboss.arquillian.container.test.api.Deployment; | ||
| import org.jboss.arquillian.junit.Arquillian; | ||
| import org.jboss.shrinkwrap.api.Archive; | ||
| @@ -31,6 +34,7 @@ | ||
| import org.junit.Assert; | ||
| import org.junit.Test; | ||
| import org.junit.runner.RunWith; | ||
| import org.wildfly.transaction.client.ContextTransactionManager; | ||
|
|
||
| /** | ||
| */ | ||
| @@ -84,4 +88,28 @@ public void testDescriptorWithNestedExpressions() throws Exception { | ||
| .getName()); | ||
| assertEquals(90, localView.getLocalViewTimeout()); | ||
| } | ||
|
|
||
| @Test | ||
| public void threadStoringTimeout() throws Exception { | ||
| TimeoutLocalView localView = (TimeoutLocalView) (new InitialContext() | ||
| .lookup("java:module/BeanWithTimeoutValue!org.jboss.as.test.integration.ejb.transaction.cmt.timeout.TimeoutLocalView")); | ||
| TransactionManager tm = (TransactionManager) new InitialContext().lookup("java:/TransactionManager"); | ||
|
|
||
| int transactionTimeoutToSet = 42; | ||
| tm.setTransactionTimeout(transactionTimeoutToSet); | ||
| Assert.assertEquals("Expecting transaction timeout has to be the same as it was written by setter", | ||
| transactionTimeoutToSet, getTransactionTimeout(tm)); | ||
|
|
||
| localView.getLocalViewTimeout(); | ||
|
|
||
| Assert.assertEquals("The transaction timeout has to be the same as before CMT call", | ||
| transactionTimeoutToSet, getTransactionTimeout(tm)); | ||
| } | ||
|
|
||
| private int getTransactionTimeout(TransactionManager tmTimeout) { | ||
| if (tmTimeout instanceof ContextTransactionManager) { | ||
| return ((ContextTransactionManager) tmTimeout).getTransactionTimeout(); | ||
| } | ||
| throw new IllegalStateException("Cannot get transaction timeout"); | ||
| } | ||
| } | ||