jboss 4.2.1 with spring 2.0.6 causes NoTransactionException
bucegiomu Sep 10, 2007 11:56 AMYes, jboss 4.2.1 causes org.springframework.transaction.NoTransactionException.
The integration between Spring and JBOSS does not work properly anymore after upgrading jboss from 4.0.4 to 4.2.1. Basically I have a CMT Stateless Session Bean EJB (SubscrFacadeBean) which is calling a spring bean (KtfPerformerImpl) as follows:
... SubscrFacadeBean.createSubscr(...) { // Get KtfPerformerImpl from Bean Factory KtfPerformerImpl impl = ...; // Call implementation impl.createSubscr(...); }
The EJB method createSubscr is marked (CMT) with a "Required" transaction attribute.
The KtfPerformerImpl.createSubscr method is marked "PROPAGATION_REQUIRED, -Exception" using an TransactionProxyFactoryBean.
In spring I'm using the JTA transaction manager as follows:
<bean id="txManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="transactionManagerName" value="java:/TransactionManager"/> <property name="userTransactionName" value="UserTransaction"/> </bean>
So, having enabled the DEBUG logging level for "org.springframework.transaction", I can see (while debugging) after entering KtfPerformerImpl.createSubscr(...):
2007-08-24 15:59:36,146 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Using tran saction object [org.springframework.transaction.jta.JtaTransactionObject@c82a01] 2007-08-24 15:59:36,146 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Using tran saction object [org.springframework.transaction.jta.JtaTransactionObject@c82a01] 2007-08-24 15:59:39,646 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Participat ing in existing transaction 2007-08-24 15:59:39,646 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Participat ing in existing transaction 2007-08-24 15:59:39,646 DEBUG [org.springframework.transaction.support.TransactionSynchronizationMan ager] Initializing transaction synchronization 2007-08-24 15:59:39,646 DEBUG [org.springframework.transaction.support.TransactionSynchronizationMan ager] Initializing transaction synchronization 2007-08-24 15:59:39,646 DEBUG [org.springframework.transaction.interceptor.TransactionInterceptor] G etting transaction for [com.picsel.server.ezine.subscr.domain.subscrregalg.impl.KtfPerformerImpl.cre ateSubscr] 2007-08-24 15:59:39,646 DEBUG [org.springframework.transaction.interceptor.TransactionInterceptor] G etting transaction for [com.picsel.server.ezine.subscr.domain.subscrregalg.impl.KtfPerformerImpl.cre ateSubscr]
So far it's cool: KtfPerformerImpl.createSubscr(...) was enlisted in the transaction opened by EJB CMT. Then an application exception is raised in KtfPerformerImpl.createSubscr(...):
com.picsel.server.ezine.subscr.exception.SubscriptionException: "ERROR_CODE 2 (not 0!) received!
which SHOULD rollback the transaction, but look what I get in the log:
2007-08-24 16:00:34,396 ERROR [EzineSubscrSrv.SUBSCR_REG_ALG__KTF_PERF_IMPL] CREATE SUBSCR: KTF request NOK after 2 tries => ABANDONING! com.picsel.server.ezine.subscr.exception.SubscriptionException: "ERROR_CODE 2 (not 0!) received! ErrorCode=SUBSCR_EXTERNAL_CREATE_FAILED at com.picsel.server.ezine.subscr.domain.subscrregalg.impl.KtfPerformerImpl.createSubscr(KtfPerform erImpl.java:203) at com.picsel.server.ezine.subscr.domain.subscrregalg.impl.KtfPerformerImpl$$FastClassByCGLIB$$1834 b76.invoke(<generated>) at net.sf.cglib.proxy.MethodProxy.invoke(MethodProxy.java:149) at org.springframework.aop.framework.Cglib2AopProxy$CglibMethodInvocation.invokeJoinpoint(Cglib2Aop Proxy.java:695) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation. java:139) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor .java:107) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation. java:161) at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopPr oxy.java:630) at com.picsel.server.ezine.subscr.domain.subscrregalg.impl.KtfPerformerImpl$$EnhancerByCGLIB$$aed74 6d5.createSubscr(<generated>) at com.picsel.server.ezine.subscr.ejb.SubscrFacadeBean.createSubscr(SubscrFacadeBean.java:165) ... 2007-08-24 16:00:35,021 WARN [EzineSubscrSrv.SUBSCR_REG_ALG__KTF_PERF_IMPL] CREATE SUBSCR: NOK: usi ng reqData {msisdn=987656789, magId=98627ed10a03127f0047f959316507ea}!SUBSCR_EXTERNAL_CREATE_FAILED: com.picsel.server.ezine.subscr.exception.SubscriptionException: "ERROR_CODE 2 (not 0!) received! 2007-08-24 16:00:35,990 DEBUG [org.springframework.transaction.interceptor.TransactionInterceptor] C ompleting transaction for [com.picsel.server.ezine.subscr.domain.subscrregalg.impl.KtfPerformerImpl. createSubscr] after exception: com.picsel.server.ezine.subscr.exception.SubscriptionException: "ERROR_CODE 2 (not 0!) received! ErrorCode=SUBSCR_EXTERNAL_CREATE_FAILED 2007-08-24 16:00:35,990 DEBUG [org.springframework.transaction.interceptor.TransactionInterceptor] C ompleting transaction for [com.picsel.server.ezine.subscr.domain.subscrregalg.impl.KtfPerformerImpl. createSubscr] after exception: com.picsel.server.ezine.subscr.exception.SubscriptionException: "ERROR_CODE 2 (not 0!) received! ErrorCode=SUBSCR_EXTERNAL_CREATE_FAILED 2007-08-24 16:00:35,990 DEBUG [org.springframework.transaction.interceptor.RuleBasedTransactionAttri bute] Applying rules to determine whether transaction should rollback on com.picsel.server.ezine.sub scr.exception.SubscriptionException: "ERROR_CODE 2 (not 0!) received! ErrorCode=SUBSCR_EXTERNAL_CREATE_FAILED 2007-08-24 16:00:35,990 DEBUG [org.springframework.transaction.interceptor.RuleBasedTransactionAttri bute] Applying rules to determine whether transaction should rollback on com.picsel.server.ezine.sub scr.exception.SubscriptionException: "ERROR_CODE 2 (not 0!) received! ErrorCode=SUBSCR_EXTERNAL_CREATE_FAILED 2007-08-24 16:00:36,006 DEBUG [org.springframework.transaction.interceptor.RuleBasedTransactionAttri bute] Winning rollback rule is: RollbackRuleAttribute with pattern [Exception] 2007-08-24 16:00:36,006 DEBUG [org.springframework.transaction.interceptor.RuleBasedTransactionAttri bute] Winning rollback rule is: RollbackRuleAttribute with pattern [Exception] 2007-08-24 16:00:36,006 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Triggering beforeCompletion synchronization 2007-08-24 16:00:36,006 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Triggering beforeCompletion synchronization 2007-08-24 16:00:36,006 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Participat ing transaction failed - marking existing transaction as rollback-only 2007-08-24 16:00:36,006 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Participat ing transaction failed - marking existing transaction as rollback-only 2007-08-24 16:00:36,006 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Setting JT A transaction rollback-only 2007-08-24 16:00:36,006 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Setting JT A transaction rollback-only 2007-08-24 16:00:36,006 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Registerin g after-completion synchronization with existing JTA transaction 2007-08-24 16:00:36,006 DEBUG [org.springframework.transaction.jta.JtaTransactionManager] Registerin g after-completion synchronization with existing JTA transaction 2007-08-24 16:00:36,006 DEBUG [org.springframework.transaction.support.TransactionSynchronizationMan ager] Clearing transaction synchronization 2007-08-24 16:00:36,006 DEBUG [org.springframework.transaction.support.TransactionSynchronizationMan ager] Clearing transaction synchronization 2007-08-24 16:00:36,006 ERROR [org.springframework.transaction.interceptor.TransactionInterceptor] A pplication exception overridden by rollback exception com.picsel.server.ezine.subscr.exception.SubscriptionException: "ERROR_CODE 2 (not 0!) received! ErrorCode=SUBSCR_EXTERNAL_CREATE_FAILED at com.picsel.server.ezine.subscr.domain.subscrregalg.impl.KtfPerformerImpl.createSubscr(KtfPerform erImpl.java:203) ... 2007-08-24 16:00:36,006 ERROR [org.springframework.transaction.interceptor.TransactionInterceptor] A pplication exception overridden by rollback exception com.picsel.server.ezine.subscr.exception.SubscriptionException: "ERROR_CODE 2 (not 0!) received! ErrorCode=SUBSCR_EXTERNAL_CREATE_FAILED at com.picsel.server.ezine.subscr.domain.subscrregalg.impl.KtfPerformerImpl.createSubscr(KtfPerform erImpl.java:203) 2007-08-24 16:00:36,006 ERROR [org.jboss.ejb.plugins.LogInterceptor] RuntimeException in method: pub lic abstract com.picsel.server.ezine.subscr.dto.Subscription com.picsel.server.ezine.subscr.ejb.inte rfaces.SubscrFacadeLocal.createSubscr(com.picsel.server.ezine.subscr.dto.ProviderAccountDto,java.uti l.Map) throws com.picsel.server.ezine.subscr.exception.SubscriptionException: org.springframework.transaction.NoTransactionException: No active JTA transaction at org.springframework.transaction.jta.JtaTransactionManager.registerAfterCompletionWithExistingTra nsaction(JtaTransactionManager.java:903) at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerAfterCompletio n(AbstractPlatformTransactionManager.java:885) at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback(Abstr actPlatformTransactionManager.java:782) at org.springframework.transaction.support.AbstractPlatformTransactionManager.rollback(AbstractPlat formTransactionManager.java:730) at org.springframework.transaction.interceptor.TransactionAspectSupport.completeTransactionAfterThr owing(TransactionAspectSupport.java:332) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor .java:111) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation. java:161) at org.springframework.aop.framework.Cglib2AopProxy$DynamicAdvisedInterceptor.intercept(Cglib2AopPr oxy.java:630) at com.picsel.server.ezine.subscr.domain.subscrregalg.impl.KtfPerformerImpl$$EnhancerByCGLIB$$aed74 6d5.createSubscr(<generated>) at com.picsel.server.ezine.subscr.ejb.SubscrFacadeBean.createSubscr(SubscrFacadeBean.java:165) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:585) at org.jboss.invocation.Invocation.performCall(Invocation.java:359) at org.jboss.ejb.StatelessSessionContainer$ContainerInterceptor.invoke(StatelessSessionContainer.ja va:237) at org.jboss.resource.connectionmanager.CachedConnectionInterceptor.invoke(CachedConnectionIntercep tor.java:158) at org.jboss.ejb.plugins.StatelessSessionInstanceInterceptor.invoke(StatelessSessionInstanceInterce ptor.java:169) at org.jboss.ejb.plugins.CallValidationInterceptor.invoke(CallValidationInterceptor.java:63) at org.jboss.ejb.plugins.AbstractTxInterceptor.invokeNext(AbstractTxInterceptor.java:121) at org.jboss.ejb.plugins.TxInterceptorCMT.runWithTransactions(TxInterceptorCMT.java:350) at org.jboss.ejb.plugins.TxInterceptorCMT.invoke(TxInterceptorCMT.java:181) at org.jboss.ejb.plugins.SecurityInterceptor.invoke(SecurityInterceptor.java:168) at org.jboss.ejb.plugins.LogInterceptor.invoke(LogInterceptor.java:205) at org.jboss.ejb.plugins.ProxyFactoryFinderInterceptor.invoke(ProxyFactoryFinderInterceptor.java:13 8) at org.jboss.ejb.SessionContainer.internalInvoke(SessionContainer.java:648) at org.jboss.ejb.Container.invoke(Container.java:960) at org.jboss.ejb.plugins.local.BaseLocalProxyFactory.invoke(BaseLocalProxyFactory.java:430) at org.jboss.ejb.plugins.local.StatelessSessionProxy.invoke(StatelessSessionProxy.java:103) at $Proxy263.createSubscr(Unknown Source) at com.picsel.server.ezine.subscr.web.servlet.CreateSubscrServlet.doPost(CreateSubscrServlet.java:1 33) at com.picsel.server.ezine.subscr.web.servlet.CreateSubscrServlet.doGet(CreateSubscrServlet.java:70 ) at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at com.picsel.server.common.web.filter.RemoteIpAddrFilter.doFilter(RemoteIpAddrFilter.java:78) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235 ) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:179) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:525) at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:128) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:104) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:543) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:241) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:580) at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:447) at java.lang.Thread.run(Thread.java:595) ...
So the transaction is marked for rollback by spring, but afterwards an org.springframework.transaction.NoTransactionException is thrown, WHICH WAS NOT HAPPENING WHEN USING JBOSS 4.0.4. The result is that the application exception is overridden by the rollback exception.
Could somebody from JBOSS team help me with this, please.