4 Replies Latest reply on Aug 19, 2009 6:08 AM by Simon Temple

    JBM2 Beta4 with JBAS5.1 - setListener( null )

    Simon Temple Newbie

      Using the JMS API. If I attempt to clear the currently registered listener on a QueueReceiver then I get an IllegalStateException when I try to receive on it:

      javax.jms.IllegalStateException: Cannot call receive(...) - a MessageHandler is set
       at org.jboss.messaging.core.client.impl.ClientConsumerImpl.receive(ClientConsumerImpl.java:161)
       at org.jboss.messaging.jms.client.JBossMessageConsumer.getMessage(JBossMessageConsumer.java:213)
       at org.jboss.messaging.jms.client.JBossMessageConsumer.receiveNoWait(JBossMessageConsumer.java:146)


      I have a simple test case which looks this:

      queueReceiver.setMessageListener( listener );
      
       queueConnection.start( );
       thread.wait( 30000 );
      
       queueReceiver.setMessageListener( null );
       queueReceiver.receiveNoWait( );
      


      How can I clear the message listener attribute from a QueueReceiver once it's been set?

        • 1. Re: JBM2 Beta4 with JBAS5.1 - setListener( null )
          Jeff Mesnil Master

           

          "simon_temple" wrote:
          Using the JMS API. If I attempt to clear the currently registered listener on a QueueReceiver then I get an IllegalStateException when I try to receive on it:

          javax.jms.IllegalStateException: Cannot call receive(...) - a MessageHandler is set
           at org.jboss.messaging.core.client.impl.ClientConsumerImpl.receive(ClientConsumerImpl.java:161)
           at org.jboss.messaging.jms.client.JBossMessageConsumer.getMessage(JBossMessageConsumer.java:213)
           at org.jboss.messaging.jms.client.JBossMessageConsumer.receiveNoWait(JBossMessageConsumer.java:146)


          I have a simple test case which looks this:

          queueReceiver.setMessageListener( listener );
          
           queueConnection.start( );
           thread.wait( 30000 );
          
           queueReceiver.setMessageListener( null );
           queueReceiver.receiveNoWait( );
          


          How can I clear the message listener attribute from a QueueReceiver once it's been set?


          Thre is a bug in the JBossMessageConsumer which prevents to unset the message listener. We'll fix it.

          Please not however that even with this bug fixed, your test case may not work.
          From MessageConsumer.setMessageListener() javadoc:


          The effect of calling MessageConsumer.setMessageListener while messages are being consumed by an existing listener or the consumer is being used to consume messages synchronously is undefined.


          You should stop your queueConnection to prevent message consumption before unsetting the message listener to have a correct behavior.

          • 2. Re: JBM2 Beta4 with JBAS5.1 - setListener( null )
            Simon Temple Newbie

            Thank you.

            I will change my test case to stop the the queueConnection and restart it once the listener has been removed (nulled).

            • 4. Re: JBM2 Beta4 with JBAS5.1 - setListener( null )
              Simon Temple Newbie

              I have retested against BETA5 and can confirm that this issue has been fixed.

              :-)