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/