activemq-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Rob Davies <rajdav...@gmail.com>
Subject Re: error in subscribing topic
Date Sun, 13 Sep 2009 16:43:41 GMT

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

> 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 ?
Yes - that's 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.
Yes - though in ActiveMQ - a Destination (Topic or Queue) is a String  
- which is used on the broker as key to look up the physical  
destination held by the broker - and create it if it doesn't exist. So  
in reality - you are just creating a key.
>
> //======
> 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") ?
Yes - correct
>
> Thanks.
> Edward


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/



Mime
View raw message