Menu

#1118 JFireEjb3TransactionRetryInterceptor not working correctly

1.2
open
nobody
JFireBase (268)
5
2015-02-22
2010-10-21
jfirechief
No

DO NOT EDIT OR ANSWER THIS ISSUE. SEE THE ORIGINAL ISSUE INSTEAD:
https://www.jfire.org/modules/bugs/view.php?id=1810
ORIGINAL REPORTER: marco

When an exception happens in an EJB, the JFireEjb3TransactionRetryInterceptor does not handle it correctly.

1) It does *not* log anything. Every exception that is caught should be logged as WARNING, if it will retry again, and as ERROR, if it is to be escalated.

2) The interceptor seems to intercept at the wrong location - INSIDE a running transaction. The stack in the additional information might help you see it.

The symptoms of the problem are that after the first execution of the EJB method, the 2nd execution immediately fails with this:

Caused by: javax.jdo.JDOException: Problem getting PersistenceManager:
NestedThrowables:
javax.resource.ResourceException: Transaction is not active: tx=TransactionImple < ac, BasicAction: 7f000101:e756:4cb5eca4:3be status: ActionStatus.ABORT_ONLY >
at org.datanucleus.jdo.connector.PersistenceManagerFactoryImpl.getPersistenceManager(PersistenceManagerFactoryImpl.java:153)
at org.nightlabs.jfire.base.Lookup.createPersistenceManager(Lookup.java:160)
at org.nightlabs.jfire.base.BaseSessionBeanImpl.createPersistenceManager(BaseSessionBeanImpl.java:126)
at org.nightlabs.jfire.security.JFireSecurityManagerBean.storePendingUser(JFireSecurityManagerBean.java:323)
at sun.reflect.GeneratedMethodAccessor317.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112)
at org.nightlabs.jfire.jboss.ejb3.JFireEjb3TransactionRetryInterceptor.invokeRetry(JFireEjb3TransactionRetryInterceptor.java:41)
at org.nightlabs.jfire.jboss.ejb3.JFireEjb3TransactionRetryInterceptor.invoke(JFireEjb3TransactionRetryInterceptor.java:30)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166)
at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47)
at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101)
at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:126)
... 194 more
Caused by: javax.resource.ResourceException: Transaction is not active: tx=TransactionImple < ac, BasicAction: 7f000101:e756:4cb5eca4:3be status: ActionStatus.ABORT_ONLY >
at org.jboss.resource.connectionmanager.TxConnectionManager.getManagedConnection(TxConnectionManager.java:319)
at org.jboss.resource.connectionmanager.BaseConnectionManager2.allocateConnection(BaseConnectionManager2.java:402)
at org.jboss.resource.connectionmanager.BaseConnectionManager2$ConnectionManagerProxy.allocateConnection(BaseConnectionManager2.java:849)
at org.datanucleus.jdo.connector.PersistenceManagerFactoryImpl.getConnection(PersistenceManagerFactoryImpl.java:96)
at org.datanucleus.jdo.connector.PersistenceManagerFactoryImpl.getPersistenceManager(PersistenceManagerFactoryImpl.java:149)
... 212 more

This means, the transaction is in ABORT state when the EJB method BEGINS (the 2nd time). IMHO strong evidence, that the OLD transaction is reused.

Our interceptor must, of course, intercept AROUND the transaction management and NOT INSIDE.

Additional information:

Daemon Thread [WorkManager(2)-6] (Suspended (breakpoint at line 48 in EventManagerBean))
EventManagerBean.storeEvent(CTEEventDTO, boolean, String[], int) line: 48
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
Method.invoke(Object, Object...) line: 597
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 112
JFireEjb3TransactionRetryInterceptor.invokeRetry(Invocation, int) line: 41
JFireEjb3TransactionRetryInterceptor.invoke(Invocation) line: 30
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
InvocationContextImpl.proceed() line: 166
EJB3InterceptorsInterceptor.invoke(Invocation) line: 63
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
TransactionScopedEntityManagerInterceptor.invoke(Invocation) line: 54
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
AllowedOperationsInterceptor.invoke(Invocation) line: 47
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
Ejb3TxPolicy(TxPolicy).invokeInCallerTx(Invocation, Transaction) line: 126
TxInterceptor$Required.invoke(Invocation) line: 195
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
TxPropagationInterceptor.invoke(Invocation) line: 95
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
StatelessInstanceInterceptor.invoke(Invocation) line: 62
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
RoleBasedAuthorizationInterceptor(RoleBasedAuthorizationInterceptor).invoke(Invocation) line: 166
RoleBasedAuthorizationInterceptor.invoke(Invocation) line: 115
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
JFireEjb3AuthenticationInterceptor(AuthenticationInterceptor).invoke(Invocation) line: 77
JFireEjb3AuthenticationInterceptor(Ejb3AuthenticationInterceptor).invoke(Invocation) line: 110
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
ENCPropagationInterceptor.invoke(Invocation) line: 46
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
AsynchronousInterceptor.invoke(Invocation) line: 106
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
StatelessContainer.dynamicInvoke(Object, Invocation) line: 304
IsLocalInterceptor.invokeLocal(Invocation, Container) line: 81
IsLocalInterceptor.invoke(Invocation) line: 72
MethodInvocation.invokeNext() line: 101
StatelessRemoteProxy.invoke(Object, Method, Object[]) line: 107
$Proxy103.storeEvent(CTEEventDTO, boolean, String[], int) line: not available
CreateEventTestCase.testCreateEvent() line: 84
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
Method.invoke(Object, Object...) line: 597
CreateEventTestCase(TestCase).runTest() line: 168
CreateEventTestCase(TestCase).runTest() line: 164
JFireTestManagerBean.runTestInNestedTransaction_runTest(TestCase) line: 446
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
Method.invoke(Object, Object...) line: 597
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 112
JFireEjb3TransactionRetryInterceptor.invokeRetry(Invocation, int) line: 41
JFireEjb3TransactionRetryInterceptor.invoke(Invocation) line: 30
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
InvocationContextImpl.proceed() line: 166
EJB3InterceptorsInterceptor.invoke(Invocation) line: 63
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
TransactionScopedEntityManagerInterceptor.invoke(Invocation) line: 54
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
AllowedOperationsInterceptor.invoke(Invocation) line: 47
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
Ejb3TxPolicy(TxPolicy).invokeInOurTx(Invocation, TransactionManager) line: 79
TxInterceptor$RequiresNew.invoke(Invocation) line: 253
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
TxPropagationInterceptor.invoke(Invocation) line: 95
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
StatelessInstanceInterceptor.invoke(Invocation) line: 62
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
RoleBasedAuthorizationInterceptor(RoleBasedAuthorizationInterceptor).invoke(Invocation) line: 166
RoleBasedAuthorizationInterceptor.invoke(Invocation) line: 115
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
JFireEjb3AuthenticationInterceptor(AuthenticationInterceptor).invoke(Invocation) line: 77
JFireEjb3AuthenticationInterceptor(Ejb3AuthenticationInterceptor).invoke(Invocation) line: 110
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
ENCPropagationInterceptor.invoke(Invocation) line: 46
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
AsynchronousInterceptor.invoke(Invocation) line: 106
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
StatelessContainer.localInvoke(Method, Object[], FutureHolder, BeanContextLifecycleCallback<StatelessBeanContext>) line: 240
StatelessContainer.localInvoke(Method, Object[], FutureHolder) line: 210
StatelessLocalProxy.invoke(Object, Method, Object[]) line: 84
$Proxy236.runTestInNestedTransaction_runTest(TestCase) line: not available
CreateEventTestCase(TestCase).runBare() line: 130
TestResult$1.protect() line: 110
TestResult.runProtected(Test, Protectable) line: 128
TestResult.run(TestCase) line: 113
CreateEventTestCase(TestCase).run(TestResult) line: 124
JFireTestRunner$TestSuiteWithNestedTx(TestSuite).runTest(Test, TestResult) line: 232
JFireTestRunner$TestSuiteWithNestedTx.runTest(Test, TestResult) line: 106
JFireTestRunner$TestSuiteWithNestedTx(TestSuite).run(TestResult) line: 227
JFireTestRunner.run(TestSuite) line: 171
JFireTestManagerBean.runTestSuiteInstances(List<TestSuite>) line: 351
JFireTestManagerBean.runAllTestSuites() line: 309
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
Method.invoke(Object, Object...) line: 597
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 112
JFireEjb3TransactionRetryInterceptor.invokeRetry(Invocation, int) line: 41
JFireEjb3TransactionRetryInterceptor.invoke(Invocation) line: 30
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
InvocationContextImpl.proceed() line: 166
EJB3InterceptorsInterceptor.invoke(Invocation) line: 63
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
TransactionScopedEntityManagerInterceptor.invoke(Invocation) line: 54
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
AllowedOperationsInterceptor.invoke(Invocation) line: 47
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
Ejb3TxPolicy(TxPolicy).invokeInCallerTx(Invocation, Transaction) line: 126
TxInterceptor$Required.invoke(Invocation) line: 195
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
TxPropagationInterceptor.invoke(Invocation) line: 95
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
StatelessInstanceInterceptor.invoke(Invocation) line: 62
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
RoleBasedAuthorizationInterceptor(RoleBasedAuthorizationInterceptor).invoke(Invocation) line: 166
RoleBasedAuthorizationInterceptor.invoke(Invocation) line: 115
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
JFireEjb3AuthenticationInterceptor(AuthenticationInterceptor).invoke(Invocation) line: 77
JFireEjb3AuthenticationInterceptor(Ejb3AuthenticationInterceptor).invoke(Invocation) line: 110
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
ENCPropagationInterceptor.invoke(Invocation) line: 46
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
AsynchronousInterceptor.invoke(Invocation) line: 106
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
StatelessContainer.localInvoke(Method, Object[], FutureHolder, BeanContextLifecycleCallback<StatelessBeanContext>) line: 240
StatelessContainer.localInvoke(Method, Object[], FutureHolder) line: 210
StatelessLocalProxy.invoke(Object, Method, Object[]) line: 84
$Proxy236.runAllTestSuites() line: not available
JFireTestRunnerInvocation.invoke() line: 52
AsyncInvokerDelegateBean.doInvocation(AsyncInvokeEnvelope) line: 105
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
Method.invoke(Object, Object...) line: 597
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 112
JFireEjb3TransactionRetryInterceptor.invokeRetry(Invocation, int) line: 41
JFireEjb3TransactionRetryInterceptor.invoke(Invocation) line: 30
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
InvocationContextImpl.proceed() line: 166
EJB3InterceptorsInterceptor.invoke(Invocation) line: 63
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
TransactionScopedEntityManagerInterceptor.invoke(Invocation) line: 54
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
AllowedOperationsInterceptor.invoke(Invocation) line: 47
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
Ejb3TxPolicy(TxPolicy).invokeInCallerTx(Invocation, Transaction) line: 126
TxInterceptor$Required.invoke(Invocation) line: 195
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
TxPropagationInterceptor.invoke(Invocation) line: 95
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
StatelessInstanceInterceptor.invoke(Invocation) line: 62
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
RoleBasedAuthorizationInterceptor(RoleBasedAuthorizationInterceptor).invoke(Invocation) line: 166
RoleBasedAuthorizationInterceptor.invoke(Invocation) line: 115
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
JFireEjb3AuthenticationInterceptor(AuthenticationInterceptor).invoke(Invocation) line: 77
JFireEjb3AuthenticationInterceptor(Ejb3AuthenticationInterceptor).invoke(Invocation) line: 110
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
ENCPropagationInterceptor.invoke(Invocation) line: 46
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
AsynchronousInterceptor.invoke(Invocation) line: 106
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
StatelessContainer.localInvoke(Method, Object[], FutureHolder, BeanContextLifecycleCallback<StatelessBeanContext>) line: 240
StatelessContainer.localInvoke(Method, Object[], FutureHolder) line: 210
StatelessLocalProxy.invoke(Object, Method, Object[]) line: 84
$Proxy122.doInvocation(AsyncInvokeEnvelope) line: not available
AsyncInvokerInvocationBean.doInvoke(AsyncInvokeEnvelope, Delegate) line: 97
AsyncInvokerInvocationBean(AsyncInvokerBaseBean).onMessage(Message) line: 221
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25
Method.invoke(Object, Object...) line: 597
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 112
JFireEjb3TransactionRetryInterceptor.invokeRetry(Invocation, int) line: 41
JFireEjb3TransactionRetryInterceptor.invoke(Invocation) line: 30
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
InvocationContextImpl.proceed() line: 166
EJB3InterceptorsInterceptor.invoke(Invocation) line: 63
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
TransactionScopedEntityManagerInterceptor.invoke(Invocation) line: 54
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
AllowedOperationsInterceptor.invoke(Invocation) line: 47
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
Ejb3TxPolicy(TxPolicy).invokeInCallerTx(Invocation, Transaction) line: 126
TxInterceptor$Required.invoke(Invocation) line: 195
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
StatelessInstanceInterceptor.invoke(Invocation) line: 62
EJBContainerInvocation<A,T>(MethodInvocation).invokeNext() line: 101
MDB(MessagingContainer).localInvoke(MethodInfo, Object[]) line: 249
MessageInflowLocalProxy.delivery(Object, MessagingContainer, Method, Object[]) line: 268
MessageInflowLocalProxy.invoke(Object, Method, Object[]) line: 138
$Proxy134.onMessage(Message) line: not available
JmsServerSession.onMessage(Message) line: 178
SpyMessageConsumer.sessionConsumerProcessMessage(SpyMessage) line: 906
SpyMessageConsumer.addMessage(SpyMessage) line: 170
SpySession.run() line: 323
JmsServerSession.run() line: 237
WorkWrapper.execute() line: 204
WorkWrapper(BasicTaskWrapper).run() line: 275
PooledExecutor$Worker.run() line: 756
Thread.run() line: 619

Discussion

  • jfirechief

    jfirechief - 2010-10-21
    • labels: --> JFireBase
    • milestone: --> 1.2
     
  • jfirechief

    jfirechief - 2010-10-21

    ORIGINAL COMMENT BY marco, VIEW IT HERE:
    https://www.jfire.org/modules/bugs/view.php?id=1810

    I already added the logging, myself, because it sucks to not see the real exception messages at all.

    The position of this interceptor in the chain is still wrong.

     

Log in to post a comment.

MongoDB Logo MongoDB