Transações no EJB3

3 respostas
rissato

Opa,

estou precisando manter uma sessão aberta no EJB3. Mais especificamente, eu preciso abrir a sessão (em um bean stateless) e manter ela aberta durante um tempo indeterminado, em que o usuário poderá acessar algumas entidades que são carregadas por um relacionamento lazy navegando pelas telas do sistema. Já tentei usar UserTransaction, mais eu recebo o erro:javax.transaction.NotSupportedException 16:52:52,651 ERROR [STDERR] at com.arjuna.ats.internal.jta.transaction.arjunacore.BaseTransaction.begin(BaseTransaction.java:79) 16:52:52,651 ERROR [STDERR] at com.arjuna.ats.jbossatx.BaseTransactionManagerDelegate.begin(BaseTransactionManagerDelegate.java:77) 16:52:52,651 ERROR [STDERR] at org.jboss.tm.usertx.client.ServerVMClientUserTransaction.begin(ServerVMClientUserTransaction.java:124) 16:52:52,651 ERROR [STDERR] at model.ejb.dao.impl.ProjetoDAOImpl.listar(ProjetoDAOImpl.java:40) 16:52:52,651 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 16:52:52,651 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 16:52:52,652 ERROR [STDERR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 16:52:52,652 ERROR [STDERR] at java.lang.reflect.Method.invoke(Method.java:597) 16:52:52,652 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112) 16:52:52,652 ERROR [STDERR] at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166) 16:52:52,652 ERROR [STDERR] at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63) 16:52:52,652 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 16:52:52,652 ERROR [STDERR] at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54) 16:52:52,652 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 16:52:52,653 ERROR [STDERR] at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47) 16:52:52,653 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 16:52:52,653 ERROR [STDERR] at org.jboss.aspects.tx.TxPolicy.invokeInCallerTx(TxPolicy.java:126) 16:52:52,653 ERROR [STDERR] at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:195) 16:52:52,653 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 16:52:52,654 ERROR [STDERR] at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:95) 16:52:52,654 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 16:52:52,654 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62) 16:52:52,654 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 16:52:52,654 ERROR [STDERR] at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77) 16:52:52,654 ERROR [STDERR] at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110) 16:52:52,654 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 16:52:52,654 ERROR [STDERR] at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46) 16:52:52,654 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 16:52:52,654 ERROR [STDERR] at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106) 16:52:52,654 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 16:52:52,654 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:240) 16:52:52,654 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:210) 16:52:52,655 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:84) 16:52:52,655 ERROR [STDERR] at $Proxy547.listar(Unknown Source) 16:52:52,655 ERROR [STDERR] at model.ejb.bo.impl.ProjetoBOImpl.listar(ProjetoBOImpl.java:20) 16:52:52,655 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 16:52:52,655 ERROR [STDERR] at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 16:52:52,655 ERROR [STDERR] at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 16:52:52,655 ERROR [STDERR] at java.lang.reflect.Method.invoke(Method.java:597) 16:52:52,655 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:112) 16:52:52,655 ERROR [STDERR] at org.jboss.ejb3.interceptor.InvocationContextImpl.proceed(InvocationContextImpl.java:166) 16:52:52,655 ERROR [STDERR] at org.jboss.ejb3.interceptor.EJB3InterceptorsInterceptor.invoke(EJB3InterceptorsInterceptor.java:63) 16:52:52,655 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 16:52:52,655 ERROR [STDERR] at org.jboss.ejb3.entity.TransactionScopedEntityManagerInterceptor.invoke(TransactionScopedEntityManagerInterceptor.java:54) 16:52:52,655 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 16:52:52,655 ERROR [STDERR] at org.jboss.ejb3.AllowedOperationsInterceptor.invoke(AllowedOperationsInterceptor.java:47) 16:52:52,656 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 16:52:52,656 ERROR [STDERR] at org.jboss.aspects.tx.TxPolicy.invokeInOurTx(TxPolicy.java:79) 16:52:52,656 ERROR [STDERR] at org.jboss.aspects.tx.TxInterceptor$Required.invoke(TxInterceptor.java:191) 16:52:52,656 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 16:52:52,656 ERROR [STDERR] at org.jboss.aspects.tx.TxPropagationInterceptor.invoke(TxPropagationInterceptor.java:95) 16:52:52,656 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 16:52:52,656 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:62) 16:52:52,656 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 16:52:52,656 ERROR [STDERR] at org.jboss.aspects.security.AuthenticationInterceptor.invoke(AuthenticationInterceptor.java:77) 16:52:52,656 ERROR [STDERR] at org.jboss.ejb3.security.Ejb3AuthenticationInterceptor.invoke(Ejb3AuthenticationInterceptor.java:110) 16:52:52,656 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 16:52:52,656 ERROR [STDERR] at org.jboss.ejb3.ENCPropagationInterceptor.invoke(ENCPropagationInterceptor.java:46) 16:52:52,656 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 16:52:52,656 ERROR [STDERR] at org.jboss.ejb3.asynchronous.AsynchronousInterceptor.invoke(AsynchronousInterceptor.java:106) 16:52:52,657 ERROR [STDERR] at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:101) 16:52:52,657 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:240) 16:52:52,657 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessContainer.localInvoke(StatelessContainer.java:210) 16:52:52,657 ERROR [STDERR] at org.jboss.ejb3.stateless.StatelessLocalProxy.invoke(StatelessLocalProxy.java:84) 16:52:52,657 ERROR [STDERR] at $Proxy550.listar(Unknown Source) 16:52:52,657 ERROR [STDERR] at view.beans.ProjetoMB.buscarProjetos(ProjetoMB.java:58) 16:52:52,657 ERROR [STDERR] at view.beans.ProjetoMB.<init>(ProjetoMB.java:54) 16:52:52,657 ERROR [STDERR] at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 16:52:52,657 ERROR [STDERR] at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 16:52:52,657 ERROR [STDERR] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 16:52:52,657 ERROR [STDERR] at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 16:52:52,657 ERROR [STDERR] at java.lang.Class.newInstance0(Class.java:355) 16:52:52,657 ERROR [STDERR] at java.lang.Class.newInstance(Class.java:308) 16:52:52,657 ERROR [STDERR] at com.sun.faces.mgbean.BeanBuilder.newBeanInstance(BeanBuilder.java:186) 16:52:52,658 ERROR [STDERR] at com.sun.faces.mgbean.BeanBuilder.build(BeanBuilder.java:106) 16:52:52,658 ERROR [STDERR] at com.sun.faces.mgbean.BeanManager.createAndPush(BeanManager.java:368) 16:52:52,658 ERROR [STDERR] at com.sun.faces.mgbean.BeanManager.create(BeanManager.java:222) 16:52:52,658 ERROR [STDERR] at com.sun.faces.el.ManagedBeanELResolver.getValue(ManagedBeanELResolver.java:88) 16:52:52,658 ERROR [STDERR] at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53) 16:52:52,658 ERROR [STDERR] at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:72) 16:52:52,658 ERROR [STDERR] at org.apache.el.parser.AstIdentifier.getValue(AstIdentifier.java:45) 16:52:52,658 ERROR [STDERR] at org.apache.el.parser.AstValue.getValue(AstValue.java:86) 16:52:52,658 ERROR [STDERR] at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186) 16:52:52,658 ERROR [STDERR] at org.apache.jasper.el.JspValueExpression.getValue(JspValueExpression.java:101) 16:52:52,658 ERROR [STDERR] at javax.faces.component.UIData.getValue(UIData.java:609) 16:52:52,658 ERROR [STDERR] at javax.faces.component.UIData.getDataModel(UIData.java:1124) 16:52:52,658 ERROR [STDERR] at javax.faces.component.UIData.setRowIndex(UIData.java:451) 16:52:52,659 ERROR [STDERR] at com.sun.faces.renderkit.html_basic.TableRenderer.encodeBegin(TableRenderer.java:77) 16:52:52,659 ERROR [STDERR] at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:813) 16:52:52,659 ERROR [STDERR] at javax.faces.component.UIData.encodeBegin(UIData.java:962) 16:52:52,659 ERROR [STDERR] at javax.faces.component.UIComponent.encodeAll(UIComponent.java:934) 16:52:52,659 ERROR [STDERR] at javax.faces.render.Renderer.encodeChildren(Renderer.java:148) 16:52:52,659 ERROR [STDERR] at javax.faces.component.UIComponentBase.encodeChildren(UIComponentBase.java:837) 16:52:52,659 ERROR [STDERR] at javax.faces.component.UIComponent.encodeAll(UIComponent.java:936) 16:52:52,659 ERROR [STDERR] at javax.faces.component.UIComponent.encodeAll(UIComponent.java:942) 16:52:52,659 ERROR [STDERR] at com.sun.faces.application.ViewHandlerImpl.doRenderView(ViewHandlerImpl.java:271) 16:52:52,659 ERROR [STDERR] at com.sun.faces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:202) 16:52:52,659 ERROR [STDERR] at com.sun.faces.lifecycle.RenderResponsePhase.execute(RenderResponsePhase.java:109) 16:52:52,659 ERROR [STDERR] at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:100) 16:52:52,659 ERROR [STDERR] at com.sun.faces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:139) 16:52:52,660 ERROR [STDERR] at javax.faces.webapp.FacesServlet.service(FacesServlet.java:266) 16:52:52,660 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290) 16:52:52,660 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 16:52:52,660 ERROR [STDERR] at org.jboss.web.tomcat.filters.ReplyHeaderFilter.doFilter(ReplyHeaderFilter.java:96) 16:52:52,660 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) 16:52:52,660 ERROR [STDERR] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 16:52:52,660 ERROR [STDERR] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:230) 16:52:52,660 ERROR [STDERR] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) 16:52:52,660 ERROR [STDERR] at org.jboss.web.tomcat.security.SecurityAssociationValve.invoke(SecurityAssociationValve.java:182) 16:52:52,660 ERROR [STDERR] at org.jboss.web.tomcat.security.JaccContextValve.invoke(JaccContextValve.java:84) 16:52:52,660 ERROR [STDERR] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 16:52:52,660 ERROR [STDERR] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102) 16:52:52,660 ERROR [STDERR] at org.jboss.web.tomcat.service.jca.CachedConnectionValve.invoke(CachedConnectionValve.java:157) 16:52:52,660 ERROR [STDERR] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) 16:52:52,661 ERROR [STDERR] at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:262) 16:52:52,661 ERROR [STDERR] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:844) 16:52:52,661 ERROR [STDERR] at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:583) 16:52:52,661 ERROR [STDERR] at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:446) 16:52:52,661 ERROR [STDERR] at java.lang.Thread.run(Thread.java:619) 16:52:52,661 WARN [AbstractEntityManagerImpl] Cannot join transaction, not a JoinableCMTTransaction 16:52:52,662 WARN [AbstractEntityManagerImpl] Cannot join transaction, not a JoinableCMTTransaction

Também já tentei usar OpenSessionInView, mas quando eu não fecho a sessão no fim da primeira requisição (feita pelo FacesServlet) o servidor reclama:Application error: Faces Servlet did not complete its transaction

Alguém tem alguma sugestão de como fazer? Ou eu errando algum detalhe em alguma das formas acima? Valeu!!!

3 Respostas

Jair_Rillo_Junior

Vamos lá.

Para usar o UserTransaction, o seu Bean deve estar usando o Bean-management transaction. Para fazer isso, você pode por exemplo usar a anotação @TransactionManagement. Caso você não esteja usando essa transação, por default, o Bean usa Container-Management que NÃO aceita o UserTransaction, talvez sua exception esteja ocorrendo por causa disso.

Se você quer manter uma sessão aberta, porque usar Stateless ao invés de Statefull?

rissato

Jair Rillo Junior:
Vamos lá.

Para usar o UserTransaction, o seu Bean deve estar usando o Bean-management transaction. Para fazer isso, você pode por exemplo usar a anotação @TransactionManagement. Caso você não esteja usando essa transação, por default, o Bean usa Container-Management que NÃO aceita o UserTransaction, talvez sua exception esteja ocorrendo por causa disso.

Se você quer manter uma sessão aberta, porque usar Stateless ao invés de Statefull?


Isso que eu estava testando aqui. Se eu mudar o bean pra Statefull funciona. :slight_smile:

Valeu d+!

Jair_Rillo_Junior

É isso ai cara, mas lembre-se em não se confundir nos conceitos

Stateless - como o nome diz, não tem estado.
Stateful - mantém estado.

Cuidado também nas transações, quando é container-managed, bean-managed e por ai vai

Criado 30 de setembro de 2008
Ultima resposta 30 de set. de 2008
Respostas 3
Participantes 2