Skip to content
Permalink
Browse files

Merge pull request #12225 from ochaloup/WFLY-10351-btm-interceptor-cl…

…eanup-timeout-issue

[WFLY-10351] BMT interceptor timeout reset adjustment
  • Loading branch information
kabir committed Apr 17, 2019
2 parents 95d8c7c + 098376c commit c3e882596c317517277e7f1619c85dd9c91c5b02
@@ -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");
}
}

0 comments on commit c3e8825

Please sign in to comment.
You can’t perform that action at this time.