activemq-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From czy11421 <czy11...@gmail.com>
Subject Re: error in subscribing topic
Date Sun, 13 Sep 2009 16:10:18 GMT
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

Mime
View raw message