Rob Davies wrote:

On 12 Sep 2009, at 23:53, czy11421 wrote:

I am running ActiveMQ 5, in the admin web page, I could see "STOCKS.SUNW" in Topics, and this topic is sending out message, then how could I subscribe this topic and get the published message ?

I have tried this coding, but I get the error as bottom. Where is the bug ?

Thanks.

//////////////////////// code /////////////////
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");
           // create a new TopicConnection for pub/sub messaging
javax.jms.TopicConnection conn = factory.createTopicConnection(); //getTopicConnection(); System.out.println(conn); // output this : ActiveMQConnection {id=ID:xxxx-PC-51013-1252720683131-0:0,clientId=null,started=false} // lookup an existing topic javax.jms.Topic mytopic = (javax.jms.Topic) ctx.lookup("STOCKS.SUNW"); //error is from here
           // create a new TopicSession for the client
javax.jms.TopicSession session = conn.createTopicSession(false, TopicSession.AUTO_ACKNOWLEDGE);
           // create a new subscriber to receive messages
javax.jms.TopicSubscriber subscriber = session.createSubscriber(mytopic);
     System.out.println(subscriber.receive());

////////////////////////// Exception ///////////////////
Exception in thread "main" javax.naming.NameNotFoundException: STOCKS.SUNW at org.apache.activemq.jndi.ReadOnlyContext.lookup(ReadOnlyContext.java:225)
 at javax.naming.InitialContext.lookup(Unknown Source)
 at com.Test.main(Test.java:31)



The ActiveMQ JNDI Context is local - in VM only. It doesn't communicate with the ActiveMQ Broker - but it does follow some conventions to allow easy "standard" ways of finding ActiveMQ administered objects (Connections, Topics, Queues etc). For example - it will create a ConnectionFactory because you've looked up in the Context for a "ConnectionFactory". It will also create a Queue or a Topic for you - if the Object you are looking up has a Queue or a Topic if the name you are looking up starts with "queue." or "topic.". Which isn't going to be of any use to you - as you want to subscribe to a Topic "STOCKS.SUNW".

However, all destinations by default are dynamic - so you just have to change: javax.jms.Topic mytopic = (javax.jms.Topic) ctx.lookup("STOCKS.SUNW"); //error is from here
for
javax.jms.Topic mytopic = session.createTopic("STOCKS.SUNW");

Something else you need to do - is call connection.start() - to start receiving messages.

cheers,

Rob

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





Thanks, your solution works. From you text, the context is local, so it doesn't have topic objects located in MQ server, so we have to create session and use session to get Topic object. My understanding is correct ?

The session.createTopic("xxx") gave me some confusion, it should be like session.locateTopic("xxx"); it is not a CREAT-new-topic, it is a LOCATE-an-existing-topic.

//======
It will also create a Queue or a Topic for you - if the Object you are looking up has a Queue or a Topic if the name you are looking up starts with "queue." or "topic.". Which isn't going to be of any use to you - as you want to subscribe to a Topic "STOCKS.SUNW".
//===========
I don't undestand this, are you saying, if I have a topic named as "topic.MyTopic", then I can use ctx.lookup("topic.MyTopic") ?

Thanks.
Edward

Reply via email to