|
Page Edited :
qpid :
How to Use JNDI
How to Use JNDI has been edited by Martin Ritchie (Jun 22, 2007). Content:How to use the PropertiesFileInitialContextFactoryThis ContextFactory uses a java properties file to setup initial values. This is the example properties file. java.naming.factory.initial = org.apache.qpid.jndi.PropertiesFileInitialContextFactory # use the following property to configure the default connector #java.naming.provider.url - ignored. # register some connection factories # connectionfactory.[jndiname] = [ConnectionURL] connectionfactory.local = amqp://guest:[EMAIL PROTECTED]/testpath?brokerlist='vm://:1' # register some queues in JNDI using the form # queue.[jndiName] = [physicalName] queue.MyQueue = example.MyQueue # register some topics in JNDI using the form # topic.[jndiName] = [physicalName] topic.ibmStocks = stocks.nyse.ibm # Register an AMQP destination in JNDI # NOTE: Qpid currently only supports direct,topics and headers # destination.[jniName] = [BindingURL] destination.direct = direct://amq.direct//directQueue The property file allows a number of queues to be defined that can then be discovered via JNDI. There are four properties used by the PFICFactory. In all of these properties the <jndiname> is the string value that would be given when performing a lookup. NOTE: This does not create the queue on the broker. You should ensure that you have created the queue before publishing to it. Queues can be declared in the virtualhosts.xml file so that they are created on broker startup, or created dynamically by consuming clients. Topics and other destinations that use temporary queues cannot be created in this way, so a consumer must be created first before publishing messages with mandatory routing. Example lookup codeThe bindingValue is the String that would be placed in <jndiname> above. Simple JNDI lookup using files // Load the properties file ... Properties properties = new Properties(); properties.load(propertiesfile_inputStream); // Create the initial context Context ctx = new InitialContext(properties); // Perform the binds object = ctx.lookup(bindingValue); // Close the context when we're done ctx.close(); Simple JNDI lookup using properties final String INITIAL_CONTEXT_FACTORY = "org.apache.qpid.jndi.PropertiesFileInitialContextFactory"; final String CONNECTION_JNDI_NAME = "local"; final String CONNECTION_NAME = "amqp://guest:[EMAIL PROTECTED]/testpath?brokerlist='vm://:1'"; final String QUEUE_JNDI_NAME = "queue"; final String QUEUE_NAME = "example.MyQueue"; // Set the properties ... Properties properties = new Properties(); properties.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY); properties.put("connectionfactory."+CONNECTION_JNDI_NAME , CONNECTION_NAME); properties.put("queue."+QUEUE_JNDI_NAME , QUEUE_NAME); // Create the initial context Context ctx = new InitialContext(properties); // Perform the lookups ConnectionFactory factory = (ConnectionFactory)ctx.lookup(CONNECTION_JNDI_NAME); Queue queue = (Queue)ctx.lookup(QUEUE_JNDI_NAME); // Close the context when we're done ctx.close(); How to use a JNDI ProviderQpid 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:
There are two steps to using JNDI objects.
There are two objects that would normally be stored in JNDI.
BindingThen you need to setup the values that the JNDI provider will used to bind your references, something like this: Setup JNDI 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. Perform Binding of ConnectionFactory 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. Bind a AMQQueue AMQQueue queue = new AMQQueue(QUEUE_URL);
ctx.bind(binding, queue);
LookupYou can then get a queue connection factory from the JNDI context. Perform Binding of ConnectionFactory 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. How to create a TopicConnectionFactory and QueueConnectionFactoryAMQConnectionFactory implements TopicConnectionFactory and QueueConnectionFactory as well as the ConnectionFactory. |
Unsubscribe or edit your notifications preferences
