2 Replies Latest reply on Jun 16, 2010 5:00 AM by simoncigoj

    Message Driven Bean and persistent msg startup

    wevr

      I have a MDB (annotated with @Name) working in Seam 2.2 with JBoss 5.1.
      JBoss has a feature that it persists undelivered messages and in the event of a server crash redelievers them later.
      What happens in this case with Seam is that the MDB gets instantied by the EJB container during the loading of my application


      16:37:47,929 INFO  [EJBContainer] STARTED EJB: ...



      JBoss finds it and tries to redeliever the messages. However, because my MDB is a Seam component and Seam is not fully initialized at this point, I get an exception from Seam.


      16:37:47,947 ERROR [JmsServerSession] Unexpected error delivering message delegator->JBossMessage[20752377977290762]:PERSISTENT, deliveryId=2
      java.lang.RuntimeException: java.lang.IllegalStateException: Attempted to invoke a Seam component outside an initialized application
           at org.jboss.ejb3.EJBContainer.invokeCallback(EJBContainer.java:1123)
           at org.jboss.ejb3.EJBContainer.invokePostConstruct(EJBContainer.java:1133)
           at org.jboss.ejb3.EJBContainer.invokePostConstruct(EJBContainer.java:1144)
           at org.jboss.ejb3.pool.AbstractPool.create(AbstractPool.java:93)
           at org.jboss.ejb3.pool.AbstractPool.create(AbstractPool.java:73)
           at org.jboss.ejb3.pool.StrictMaxPool.get(StrictMaxPool.java:146)
           at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:58)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
           at org.jboss.aspects.tx.TxPolicy.invokeInNoTx(TxPolicy.java:66)
           at org.jboss.ejb3.tx.TxInterceptor$NotSupported.invoke(TxInterceptor.java:114)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
           at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
           at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:80)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
           at org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:67)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
           at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
           at org.jboss.ejb3.mdb.MessagingContainer.localInvoke(MessagingContainer.java:282)
           at org.jboss.ejb3.mdb.inflow.MessageInflowLocalProxy.delivery(MessageInflowLocalProxy.java:270)
           at org.jboss.ejb3.mdb.inflow.MessageInflowLocalProxy.invoke(MessageInflowLocalProxy.java:140)
           at $Proxy638.onMessage(Unknown Source)
           at org.jboss.resource.adapter.jms.inflow.JmsServerSession.onMessage(JmsServerSession.java:178)
           at org.jboss.jms.client.container.ClientConsumer.callOnMessageStatic(ClientConsumer.java:160)
           at org.jboss.jms.client.container.SessionAspect.handleRun(SessionAspect.java:831)
           at org.jboss.aop.advice.org.jboss.jms.client.container.SessionAspect_z_handleRun_24479617.invoke(SessionAspect_z_handleRun_24479617.java)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
           at org.jboss.jms.client.container.ClosedInterceptor.invoke(ClosedInterceptor.java:170)
           at org.jboss.aop.advice.PerInstanceInterceptor.invoke(PerInstanceInterceptor.java:86)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
           at org.jboss.jms.client.delegate.ClientSessionDelegate.run(ClientSessionDelegate.java)
           at org.jboss.jms.client.JBossSession.run(JBossSession.java:199)
           at org.jboss.resource.adapter.jms.inflow.JmsServerSession.run(JmsServerSession.java:234)
           at org.jboss.resource.work.WorkWrapper.execute(WorkWrapper.java:205)
           at org.jboss.util.threadpool.BasicTaskWrapper.run(BasicTaskWrapper.java:260)
           at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
           at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
           at java.lang.Thread.run(Unknown Source)
      Caused by: java.lang.IllegalStateException: Attempted to invoke a Seam component outside an initialized application
           at org.jboss.seam.contexts.Lifecycle.getApplication(Lifecycle.java:36)
           at org.jboss.seam.contexts.Lifecycle.setupApplication(Lifecycle.java:134)
           at org.jboss.seam.Seam.componentForName(Seam.java:301)
           at org.jboss.seam.intercept.SessionBeanInterceptor.postConstruct(SessionBeanInterceptor.java:102)
           at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
           at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
           at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
           at java.lang.reflect.Method.invoke(Unknown Source)
           at org.jboss.ejb3.interceptors.aop.LifecycleCallbackInterceptorMethodInterceptor.invoke(LifecycleCallbackInterceptorMethodInterceptor.java:80)
           at org.jboss.aop.joinpoint.ConstructionInvocation.invokeNext(ConstructionInvocation.java:79)
           at org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor.setup(InvocationContextInterceptor.java:88)
           at org.jboss.aop.advice.org.jboss.ejb3.interceptors.aop.InvocationContextInterceptor_z_setup_24479617.invoke(InvocationContextInterceptor_z_setup_24479617.java)
           at org.jboss.aop.joinpoint.ConstructionInvocation.invokeNext(ConstructionInvocation.java:79)
           at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67)
           at org.jboss.aop.joinpoint.ConstructionInvocation.invokeNext(ConstructionInvocation.java:79)
           at org.jboss.ejb3.EJBContainer.invokeCallback(EJBContainer.java:1119)
           ... 38 more



      Now, I may be fine with the error messages thrown here but after that, the MDB stops working even after Seam initialization!


      16:38:00,232 ERROR [JmsServerSession] Unexpected error delivering message delegator->JBossMessage[20752377978519563]:PERSISTENT, deliveryId=3
      javax.ejb.EJBException: Failed to acquire the pool semaphore, strictTimeout=10000
           at org.jboss.ejb3.pool.StrictMaxPool.get(StrictMaxPool.java:127)
           at org.jboss.ejb3.stateless.StatelessInstanceInterceptor.invoke(StatelessInstanceInterceptor.java:58)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
           at org.jboss.aspects.tx.TxPolicy.invokeInNoTx(TxPolicy.java:66)
           at org.jboss.ejb3.tx.TxInterceptor$NotSupported.invoke(TxInterceptor.java:114)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
           at org.jboss.ejb3.tx.NullInterceptor.invoke(NullInterceptor.java:42)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
           at org.jboss.ejb3.security.Ejb3AuthenticationInterceptorv2.invoke(Ejb3AuthenticationInterceptorv2.java:80)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
           at org.jboss.ejb3.BlockContainerShutdownInterceptor.invoke(BlockContainerShutdownInterceptor.java:67)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
           at org.jboss.aspects.currentinvocation.CurrentInvocationInterceptor.invoke(CurrentInvocationInterceptor.java:67)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
           at org.jboss.ejb3.mdb.MessagingContainer.localInvoke(MessagingContainer.java:282)
           at org.jboss.ejb3.mdb.inflow.MessageInflowLocalProxy.delivery(MessageInflowLocalProxy.java:270)
           at org.jboss.ejb3.mdb.inflow.MessageInflowLocalProxy.invoke(MessageInflowLocalProxy.java:140)
           at $Proxy638.onMessage(Unknown Source)
           at org.jboss.resource.adapter.jms.inflow.JmsServerSession.onMessage(JmsServerSession.java:178)
           at org.jboss.jms.client.container.ClientConsumer.callOnMessageStatic(ClientConsumer.java:160)
           at org.jboss.jms.client.container.SessionAspect.handleRun(SessionAspect.java:831)
           at org.jboss.aop.advice.org.jboss.jms.client.container.SessionAspect_z_handleRun_24479617.invoke(SessionAspect_z_handleRun_24479617.java)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
           at org.jboss.jms.client.container.ClosedInterceptor.invoke(ClosedInterceptor.java:170)
           at org.jboss.aop.advice.PerInstanceInterceptor.invoke(PerInstanceInterceptor.java:86)
           at org.jboss.aop.joinpoint.MethodInvocation.invokeNext(MethodInvocation.java:102)
           at org.jboss.jms.client.delegate.ClientSessionDelegate.run(ClientSessionDelegate.java)
           at org.jboss.jms.client.JBossSession.run(JBossSession.java:199)
           at org.jboss.resource.adapter.jms.inflow.JmsServerSession.run(JmsServerSession.java:234)
           at org.jboss.resource.work.WorkWrapper.execute(WorkWrapper.java:205)
           at org.jboss.util.threadpool.BasicTaskWrapper.run(BasicTaskWrapper.java:260)
           at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
           at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
           at java.lang.Thread.run(Unknown Source)




      I tried to fix this by using @Startup, but it can only be used with @Scope which i can not use on a MDB :(


      Any other ideas how I can delay the initialization of my MDB or the redelivery of the messages? I thought about writing a plain EJB MDB that checks whether Seam is alive yet and only then delivers the message to a Seam component.



      PS: I also searched for any solution to disable the persisting of messages by JBoss, which would have been the easiest solution. Correct me if I'm wrong, but this is not possible for a single queue... :/

        • 1. Re: Message Driven Bean and persistent msg startup
          kapitanpetko

          Search the Seam JIRA for 'MDB', there is an open ticket with the solution. Basically, you make your MDB dependent on a JBoss component, so it starts after Seam is initialized.


          HTH

          • 2. Re: Message Driven Bean and persistent msg startup
            simoncigoj

            I have the sam isue, on
            jboss5.1GA
            seam 2.2.0GA
            jboss messaging 1.4


            I'm using a mdb which is also a seam component and inject some other seam components into it, it works ok until the server restart after the crash. When the mdb is deploed again and tries to receive the messages agan I got the exact same error as above.


            I tried the solution from https://jira.jboss.org/browse/JBSEAM-2286?focusedCommentId=12535875/


            As I see this isuee is stil unresolved in seam 2.0.0 but i have the same problem in 2.2.0


            Is there any other posibility to delay the reading ov messages from the queue on startup or maybe to block the submitting messeges on server startap and then start the submition of messages when seam is fully deploed?