Hi Gary, that was a great idea, and I hadn't tried it yet, but ActiveMQ doesn't seem to like having anything else in the context path. I get:

[WARN] TcpTransportFactory - path isn't a valid local location for TcpTransport to use <java.lang.NumberFormatException: For input string: "/dynamicQueues/">java.lang.NumberFormatException: For input string: "/dynamicQueues/"

and then it fails, of course, with:

javax.naming.NameNotFoundException: foo

The path I was using was

tcp://localhost:61616/dynamicQueues/

I tried it both with and without the trailing / and it didn't make a difference.

Any other ideas?
  Thanks,
   -M@

On Oct 28, 2009, at 4:28 AM, Gary Tully wrote:

think you may have to modify the source to achieve what you want here.

Is the initial context used for destination lookup parametrised?
I wonder if a solution would be to have the provider url contain the context
in its path.

so  something like: tcp://localhost:61616/dynamicQueues
such that the returned initial context is the "dynamicQueue" context. Then
lookup for any queue would succeed.

Again, this would require some code change to
org.apache.activemq.jndi.ActiveMQInitialContextFactory, and the same context would not contain a factory reference. But the factory could be statically
configured I guess.

The problem with not having a separate dynamic context for queues and topics
is that they cannot be differentiated.

All patches/contributions welcome with thanks :-)

2009/10/27 Matthew Hixson <hix...@poindextrose.org>

Properties props = new Properties();
props
.setProperty
(Context
.INITIAL_CONTEXT_FACTORY
,"org.apache.activemq.jndi.ActiveMQInitialContextFactory");
props.setProperty(Context.PROVIDER_URL, "tcp://localhost:61616");
InititalContext ic = new InitialContext(props));
QueueConnectionFactory factory =
(QueueConnectionFactory)ic.lookup("queueConnectionFactory");
QueueSession jmsSession = jmsConnection.createQueueSession(false,
javax.jms.Session.AUTO_ACKNOWLEDGE);
Queue jmsqueue = (javax.jms.Queue)ic.lookup("dynamicQueues/" + QUEUE_NAME);


I have the above code working to get a queue that is not defined in my jndi.properties. If I configure the queue in jndi.properties then I don't
need the "dynamicQueues/" to proceed QUEUE_NAME.
What I'm doing is trying to replace a proprietary JMS server with
ActiveMQ.  It looks as if this other software makes all of its queues
available through the InitialContext. So our existing code finds already
existing queues in the JMS server just by doing:

Queue jmsqueue = (javax.jms.Queue)ic.lookup(QUEUE_NAME);

So it would be Very Convenient if I could get ActiveMQ to do the same thing so that we don't have to dredge through our codebase modifying every call to
ic.lookup().
Is it possible to get that behavior through an ActiveMQ configuration? If
not then I suppose I could modify the ActiveMQ source to prepend
"dynamicQueues/" to any queue name it is asked to lookup, but I'd rather not
do that if its not necessary.
Thanks,
-M@




--
http://blog.garytully.com

Open Source Integration
http://fusesource.com

Reply via email to