Rob Davies wrote:

On 14 Sep 2009, at 00:00, czy11421 wrote:

Rob Davies wrote:

On 13 Sep 2009, at 20:03, czy11421 wrote:

Rob Davies wrote:

On 13 Sep 2009, at 17:55, czy11421 wrote:

Rob,
Thanks for your reply.

Here is another question. If I use MessageListener, how could I start to receive message ? Coding as below, the Listener will NOT output message. Did I miss something ?

Thanks.
Edward

//---------------------------------
session = conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE); javax.jms.Topic mytopic = session.createTopic("STOCKS.SUNW");

        Test2.MyListener listener = new Test2.MyListener();

javax.jms.TopicSubscriber subscriber = session.createSubscriber(mytopic);
                  /**  == works
        while(true){
            Message message = subscriber.receive();
            TextMessage text = (TextMessage) message;
            System.out.println(text.getText());
            Thread.sleep(1000);
        }
        **/

        subscriber.setMessageListener(listener);
//-------------------------------------------

//-----------------------------------
static class MyListener implements MessageListener {
    public void onMessage(Message message) {
        System.out.println("Message: ");
        TextMessage text = (TextMessage) message;
        try {
            System.out.println("Message: " + text.getText());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
//-----------------------------------
You shouldn't set the listener on the same subscriber after calling receive() - its best to create a new session for each new subscriber

cheers,

Rob

Rob Davies
twitter.com/rajdavies
I work here: http://fusesource.com
My Blog: http://rajdavies.blogspot.com/
I'm writing this: http://www.manning.com/snyder/





Rob,
Thanks. I did not "set the listener on the same subscriber after calling receive()", as you see, the coding has been commented out.

If I use while(true){...}, it will work, but I switch to MessageListener, it can't output received message .

Thanks.
Edward

Hi Edward,

thats very strange - and certainly not normal behaviour - could you send a test case - to replicate what you are doing ?

cheers,

Rob

Rob Davies
http://twitter.com/rajdavies
I work here: http://fusesource.com
My Blog: http://rajdavies.blogspot.com/
I'm writing this: http://www.manning.com/snyder/






Hi, Rob,

The coding is below. The topic is using Market Data demo shipped with ActiveMQ.

Thanks.
Edward

///////////////////////
package com;

import java.util.Properties;

import javax.jms.Message;
import javax.jms.MessageListener;
import javax.jms.TextMessage;
import javax.jms.TopicSession;
import javax.naming.Context;
import javax.naming.InitialContext;

public class Test2 {
  static javax.jms.TopicConnection conn;
  static javax.jms.TopicSession session;

  static class MyListener implements MessageListener {
      public void onMessage(Message message) {
          System.out.println("Message: ");
          TextMessage text = (TextMessage) message;
          try {
              System.out.println("Message: " + text.getText());
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
  }

  public static void main(String[] aaa) throws Exception {
      try {
          Properties props = new Properties();
props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "org.apache.activemq.jndi.ActiveMQInitialContextFactory"); props.setProperty(Context.PROVIDER_URL, "tcp://localhost:61616");
          javax.naming.Context ctx = new InitialContext(props);

          // lookup the connection factory
javax.jms.TopicConnectionFactory factory = (javax.jms.TopicConnectionFactory) ctx.lookup("ConnectionFactory");

          conn = factory.createTopicConnection();
          System.out.println(conn);
                    conn.start();

session = conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
          javax.jms.Topic mytopic = session.createTopic("STOCKS.SUNW");

          Test2.MyListener listener = new Test2.MyListener();

javax.jms.TopicSubscriber subscriber = session.createSubscriber(mytopic);
                    /**  == works
          while(true){
              Message message = subscriber.receive();
              TextMessage text = (TextMessage) message;
              System.out.println(text.getText());
              Thread.sleep(1000);
          }
          **/
                    subscriber.setMessageListener(listener);
      } catch (Exception e) {
          e.printStackTrace();
      } finally {
          session.close();
          conn.close();
      }
  }
}
/////////////////////////


Hi Edward,

you need to put a long sleep at the end of the main method - as all the threads are daemon threads - there has to be a least one application thread running

cheers,

Rob
Rob Davies
http://twitter.com/rajdavies
I work here: http://fusesource.com
My Blog: http://rajdavies.blogspot.com/
I'm writing this: http://www.manning.com/snyder/






Hi, Rob,
Oh,yes, at least I need to keep main thread alive.I fix it, it works now. Learned a lot from you. Thanks.

Edward.

Reply via email to