Qpid will work with any JNDI provider capable of storing Java objects. We have a task to add our own initial context factory, but until that's available ....
First you must select a JNDI provider to use. If you aren't already using an application server (i.e. Tomcat ?) which provides JNDI support you could consider using either:
- Apache's Directory which provides an LDAP JNDI implementation
- OR the SUN JNDI SPI for the FileSystem which can be downloaded from http://java.sun.com/products/jndi/downloads/index.html
- Click : Download JNDI 1.2.1 & More button
- Download: File System Service Provider, 1.2 Beta 3
- and then add the two jars in the lib dir to your class path.
There are two steps to using JNDI objects.
- Bind : Which stores a reference to a JMS Object in the provider.
- Lookup : Which tries to retrieve the reference and create the JMS Object.
There are two objects that would normally be stored in JNDI.
- A ConnectionFactory
- A Destination (Queue or Topic)
Binding
Then you need to setup the values that the JNDI provider will used to bind your references, something like this:
Hashtable env = new Hashtable(11); env.put(Context.INITIAL_CONTEXT_FACTORY,"com.sun.jndi.fscontext.RefFSContextFactory"); env.put(Context.PROVIDER_URL,LOCAL_FILE_PATH_FOR_STORING_BINDS_PATH_MUST_EXIST);
These values are then used to create a context to bind your references.
try { Context ctx = new InitialContext(env); // Create the object to be bound in this case a ConnectionFactory ConnectionFactory factory = null; try { factory = new AMQConnectionFactory(CONNECTION_URL); try { ctx.bind(binding, factory); } catch (NamingException e) { //Handle problems with binding. Such as the binding already exists. } } catch (URLSyntaxException amqe) { //Handle any exception with creating ConnnectionFactory } } catch (NamingException e) { //Handle problem creating the Context. }
To bind a queue instead simply create a AMQQueue object and use that in the binding call.
AMQQueue queue = new AMQQueue(QUEUE_URL); ctx.bind(binding, queue);
Lookup
You can then get a queue connection factory from the JNDI context.
ConnectionFactory factory; try { factory= (ConnectionFactory)ctx.lookup(binding); } catch (NamingException e) { //Handle problems with lookup. Such as binding does not exist. }
Note that you need not cast the bound object back to an AMQConnectionFactory
so all your current JMS apps that use JNDI can start using Qpid straight away.