TimerService + transacões e problemas

Oi pessoal :slight_smile:

Apenas para efeito de estudo, estou criando um Bean com o seguinte propósito.
Caso Dê algum erro na inserção de um registro, um timer é criado para tentar aquela inserção depois de 5 segundos.
Eu provoquei um erro assim: O nome do corretor é deve ser único, caso eu tente inserir de novo o mesmo nome vai ocorrer um erro, e o método marcado como timeout vai tentar inserir o mesmo registro só que alterando o nome.

o código:

@Stateless(name="OutraAcao")

public class OutraAcao implements OutraAcaoRemota {

    @PersistenceContext(unitName="UnidadePersistencia")
    EntityManager em;

    @Resource
    private TimerService ts;
    
     @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) 
    public void cadastrar(String nome){

         Corretor c = new Corretor();
         c.setNome(nome);
        
         try{
             // Caso eu chame retentar(c) aqui, funciona!!
             // retentar(c);
            em.persist(c);
         }
         catch(PersistenceException e){
             retentar(c);
         }
    }

     @Timeout
     public void recadastro(Timer t){
         Corretor c = (Corretor)t.getInfo();
         c.setNome(c.getNome()+" Tentativa ");
         try{
         em.persist(c);
         }
         catch(PersistenceException e){            
             System.out.println("Não deu pra recuperar");
             e.printStackTrace();
         }
     }

     @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW) /*Requires_new para que a reversão da transação
      não seja propagada ate esse método cancelando a criação do timer*/
     private void retentar(Corretor c){        
         ts.createTimer(5*1000, c); // ERRO AQUI, EJB Exception, diz que não pode criar o timer etc etc
     }


}

Alguém tem alguma idéia gente? :slight_smile:

obrigado hein

Poste sua stack trace para ficar mais fácil de ajudar…Outra coisa, seu objeto Corretor implementa Serializable ?

opa, belza?

botei o create timer num try catch e chamei um log no erro:

[#|2010-01-28T11:07:49.234-0200|SEVERE|glassfishv3.0|neg.OutraAcao|_ThreadID=29;_ThreadName=Thread-1;|ERRO DO TIMER
javax.ejb.EJBException
	at com.sun.ejb.containers.EJBTimerService.createTimer(EJBTimerService.java:1125)
	at com.sun.ejb.containers.EJBTimerService.createTimer(EJBTimerService.java:1023)
	at com.sun.ejb.containers.EJBTimerService.createTimer(EJBTimerService.java:1012)
	at com.sun.ejb.containers.EJBTimerServiceWrapper.createTimerInternal(EJBTimerServiceWrapper.java:271)
	at com.sun.ejb.containers.EJBTimerServiceWrapper.createTimerInternal(EJBTimerServiceWrapper.java:260)
	at com.sun.ejb.containers.EJBTimerServiceWrapper.createTimer(EJBTimerServiceWrapper.java:103)
	at neg.OutraAcao.retentar(OutraAcao.java:73)
	at neg.OutraAcao.cadastrar(OutraAcao.java:52)
	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:597)
	at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
	at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
	at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5243)
	at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:615)
	at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
	at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:567)
	at neg.Filtro.filtro(Filtro.java:35)
	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:597)
	at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:858)
	at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
	at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:567)
	at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:157)
	at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:139)
	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:597)
	at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:858)
	at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
	at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:367)
	at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5215)
	at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5203)
	at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:190)
	at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84)
	at $Proxy254.cadastrar(Unknown Source)
	at neg.Acao.cadastrar(Acao.java:35)
	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:597)
	at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1052)
	at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1124)
	at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:5243)
	at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:615)
	at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
	at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:567)
	at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doAround(SystemInterceptorProxy.java:157)
	at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:139)
	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:597)
	at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:858)
	at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:797)
	at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:367)
	at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:5215)
	at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:5203)
	at com.sun.ejb.containers.EJBObjectInvocationHandler.invoke(EJBObjectInvocationHandler.java:201)
	at com.sun.ejb.containers.EJBObjectInvocationHandlerDelegate.invoke(EJBObjectInvocationHandlerDelegate.java:75)
	at $Proxy252.cadastrar(Unknown Source)
	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:597)
	at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie.dispatchToMethod(ReflectiveTie.java:146)
	at com.sun.corba.ee.impl.presentation.rmi.ReflectiveTie._invoke(ReflectiveTie.java:176)
	at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatchToServant(CorbaServerRequestDispatcherImpl.java:682)
	at com.sun.corba.ee.impl.protocol.CorbaServerRequestDispatcherImpl.dispatch(CorbaServerRequestDispatcherImpl.java:216)
	at com.sun.corba.ee.impl.protocol.CorbaMessageMediatorImpl.handleRequestRequest(CorbaMessageMediatorImpl.java:1841)
	at com.sun.corba.ee.impl.protocol.SharedCDRClientRequestDispatcherImpl.marshalingComplete(SharedCDRClientRequestDispatcherImpl.java:119)
	at com.sun.corba.ee.impl.protocol.CorbaClientDelegateImpl.invoke(CorbaClientDelegateImpl.java:235)
	at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.privateInvoke(StubInvocationHandlerImpl.java:187)
	at com.sun.corba.ee.impl.presentation.rmi.StubInvocationHandlerImpl.invoke(StubInvocationHandlerImpl.java:147)
	at com.sun.corba.ee.impl.presentation.rmi.codegen.CodegenStubBase.invoke(CodegenStubBase.java:225)
	at neg.__AcaoRemota_Remote_DynamicStub.cadastrar(neg/__AcaoRemota_Remote_DynamicStub.java)
	at neg._AcaoRemota_Wrapper.cadastrar(neg/_AcaoRemota_Wrapper.java)
	at mb.MBPrincipal.cadastrar(MBPrincipal.java:37)
	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:597)
	at com.sun.el.parser.AstValue.invoke(AstValue.java:234)
	at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:297)
	at javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:88)
	at com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:102)
	at javax.faces.component.UICommand.broadcast(UICommand.java:315)
	at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:775)
	at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1267)
	at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:82)
	at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
	at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118)
	at javax.faces.webapp.FacesServlet.service(FacesServlet.java:312)
	at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1523)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:188)
	at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:641)
	at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)
	at com.sun.enterprise.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)
	at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:332)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:233)
	at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)
	at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)
	at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)
	at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954)
	at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)
	at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)
	at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)
	at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:76)
	at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)
	at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)
	at com.sun.grizzly.ContextTask.run(ContextTask.java:69)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:330)
	at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:309)
	at java.lang.Thread.run(Thread.java:619)
Caused by: javax.ejb.EJBTransactionRolledbackException
	at com.sun.ejb.containers.BaseContainer.mapLocal3xException(BaseContainer.java:2204)
	at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:2004)
	at com.sun.ejb.containers.BaseContainer.postInvoke(BaseContainer.java:1906)
	at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:198)
	at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:84)
	at $Proxy206.createTimer(Unknown Source)
	at com.sun.ejb.containers.EJBTimerService.createTimer(EJBTimerService.java:1104)
	... 120 more
Caused by: javax.ejb.TransactionRolledbackLocalException: Client's transaction aborted
	at com.sun.ejb.containers.BaseContainer.useClientTx(BaseContainer.java:4576)
	at com.sun.ejb.containers.BaseContainer.preInvokeTx(BaseContainer.java:4454)
	at com.sun.ejb.containers.BaseContainer.preInvoke(BaseContainer.java:1826)
	at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:188)
	... 123 more
|#]

O corretor implementa serializable sim, observe que na linha 18 eu escrevi que se chamar o retentar ali ele cria o timer normalmente

Obrigado :slight_smile:

Então cara…A documentação irá
te ajudar neste momento…Uma EJBException é lançada por um createTimer devido a uma falha de sistema…Por isso creio que seja errado criar
um Timer neste contexto que vc está tentando, logo depois de uma exceção de sistema no mesmo bean…Da uma modificadinha aí na sua lógica que vai funcionar…

abraços…

Eu já olhei aí. Não vi nada que possa ajudar, só descreve os parametros e exceções…

Por quer será que não pode chamar o createTimer logo depois de uma exceção?

O metodo que cria o timer tá requires_new, a meu ver ele nem devia ser atingido pelo erro do outro :S

Opa,

Então cara, a documentação fala que uma EJBException é levantada devido a um exceção ou falha de sistema…
De qualquer forma vou dar uma testada nisso quando chegar em casa, se descobrir algo novo eu te falo, ou então se vc coseguir fazer poste aí a solução…

abraço…

é … ou seja … não fala nada ahuahuhauhau.

já tentei varias coisas aqui e ainda não rolou :S

vi sua msg privada.
olhando beeem por cima, é erro no servico de timer.
ve se a configuracao ta certinha, se tiver empenho, trabalhe com hotspot, debug, pra ir detalhando.

melhor forma de aprender é errando.

Não sei mais o que fazer nao :S rs

entao gente …

a partir de uma ideia do nosso amigo breno500as eu testei provocar uma exception chamando um new PersistenceExceptio … e dessa forma o timer funciona …
se o gerenciador de entidades realmente tiver um exception aí não funciona a criação do timer … agora … porq?
testei no jboss

“java.lang.illegalstateexception: unable to persist timer”

procurei esse erro … e é o seguinte:

pelo o que entendi … o container usa o gerenciador de entidades para realizar a persistencia do timer. Se o gerenciador de entidades realmente sofrer um erro ele dará erro ao ser usado para criar o timer …

está melhor descrito aqui:

http://shrubbery.mynetgear.net/wiki/Upgrading_to_JBoss_4.2_from_4.0

eu acho que o glassfish deve trabalhar da mesma forma … por isso deu erro tambem :slight_smile:

vou dar uma parada nesse problema por enquanto … pq era só pra estudo … vou acabar usando meu tempo todo nele :slight_smile:

mas se alguem tiver um bom comentario ai :slight_smile: será bem vindo

obrigado