Qpid client destinations and connection factories can be registered in external JNDI containers, for example, Tomcat JNDI implementation.
org.apache.qpid.jndi.ObjectFactory implements
javax.naming.spi.ObjectFactory
allowing it to create instances of AMQConnectionFactory, PooledConnectionFactory,
AMQConnection, AMQQueue and AMQTopic in external JNDI container from
javax.naming.References.
Additionally,
AMQConnectionFactory, PooledConnectionFactory and AMQDestination (parent of
AMQQueue and AMQTopic) implement
javax.naming.Referenceable
allowing creation of javax.naming.Reference objects
for binding in external JNDI implementations.
org.apache.qpid.jndi.ObjectFactory allows the creation of:
an instance of ConnectionFactory from a Reference containing reference
address (javax.naming.RefAddr)
connectionURL with content set to a
Connection URL.
an instance of PooledConnectionFactory from a Reference containing reference
address (javax.naming.RefAddr)
connectionURL with content set to a
Connection URL.
an instance of AMQConnection from a Reference containing reference
address (javax.naming.RefAddr)
connectionURL with content set to a
Connection URL.
an instance of AMQQueue from a Reference containing reference
address (javax.naming.RefAddr)
address with content set to either Address or
Binding URL.
an instance of AMQTopic from a Reference containing reference
address (javax.naming.RefAddr)
address with content set to either Address or
Binding URL.
For AMQQueue and AMQTopic prefix BURL: need
to be specified for Binding URL. Otherwise, client will try
to parse content using Address format.
An example below demonstrates how to create JNDI resources in the Tomcat container using Resource declarations in context.xml (A Tomcat specific web application configuration file usually added into war under /META-INF/context.xml).
Example E.1. An example of Tomcat context.xml declaring Qpid JNDI resources
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE xml>
<Context>
<Resource name="jms/connectionFactory" auth="Container"
type="org.apache.qpid.client.AMQConnectionFactory"
factory="org.apache.qpid.jndi.ObjectFactory"
connectionURL="amqp://guest:guest@clientid/?brokerlist='localhost:5672'"/>
<Resource name="jms/pooledConnectionFactory" auth="Container"
type="org.apache.qpid.client.PooledConnectionFactory"
factory="org.apache.qpid.jndi.ObjectFactory"
connectionURL="amqp://guest:guest@clientid/?brokerlist='localhost:5672'"
maxPoolSize="20" connectionTimeout="60000"/>
<Resource name="jms/queue" auth="Container"
type="org.apache.qpid.client.AMQQueue"
factory="org.apache.qpid.jndi.ObjectFactory"
address="BURL:direct://amq.direct//myQueue?durable='true'"/>
<Resource name="jms/topic" auth="Container"
type="org.apache.qpid.client.AMQTopic"
factory="org.apache.qpid.client.AMQConnectionFactory"
address="BURL:topic://amq.topic//myTopic?routingkey='myTopic'"/>
</Context>In the example above AMQConnectionFactory would be registered under JNDI name "jms/connectionFactory",
PooledConnectionFactory would be registered under JNDI name "jms/pooledConnectionFactory",
Queue "myQueue" would be registered under JNDI name "jms/queue" and JMS Topic
destination "myTopic" would be registered under JNDI name "jms/topic". (All resources will be bound under "java:comp/env").
On declaration of PooledConnectionFactory optional maxPoolSize and connectionTimeout are set to
20 and 60000 milliseconds accordingly.
The client application can find the resources declared in Tomcat context.xml using the code below:
Example E.2. An example of JNDI lookup for Qpid resources registered in Tomcat JNDI
Context context = new InitialContext();
Context environmentContext = (Context)context.lookup("java:comp/env");
...
ConnectionFactory connectionFactory = (ConnectionFactory) environmentContext.lookup("jms/connectionFactory");
...
Queue queue = (Queue)environmentContext.lookup("jms/queue");
...
Topic topic = (Topic)environmentContext.lookup("jms/topic");
...
In order to support backward compatibility AMQConnectionFactory continues to implement
javax.naming.spi.ObjectFactory
and can be used to instantiate JNDI resources from
javax.naming.References.
However, its method getObjectInstance is marked as Deprecated and will be
removed in future version of client. For backward compatibility, Qpid JNDI resources can be declared using fully
qualified class names as addresses. That will became unsupported in future version as well.
An example of Tomcat context.xml with declarations of JNDI resources using deprecated factory and addresses is provided below.
Example E.3. An example of Tomcat context.xml declaring Qpid JNDI resources using deprecated ObjectFactory and deprecated addresses
<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE xml>
<Context>
<Resource name="jms/queue" auth="Container"
type="org.apache.qpid.client.AMQQueue"
factory="org.apache.qpid.client.AMQConnectionFactory"
org.apache.qpid.client.AMQQueue="direct://amq.direct//myDurableQueue?durable='true'"/>
<Resource name="jms/topic" auth="Container"
type="org.apache.qpid.client.AMQTopic"
factory="org.apache.qpid.client.AMQConnectionFactory"
org.apache.qpid.client.AMQTopic="topic://amq.topic//myTopic?routingkey='myTopic'"/>
<Resource name="jms/connectionFactory" auth="Container"
type="org.apache.qpid.client.AMQConnectionFactory"
factory="org.apache.qpid.client.AMQConnectionFactory"
org.apache.qpid.client.AMQConnectionFactory="amqp://guest:guest@clientid/?brokerlist='localhost:5672'"/>
</Context>
Apache Qpid, Messaging built on AMQP; Copyright © 2015 The Apache Software Foundation; Licensed under the Apache License, Version 2.0; Apache Qpid, Qpid, Qpid Proton, Proton, Apache, the Apache feather logo, and the Apache Qpid project logo are trademarks of The Apache Software Foundation; All other marks mentioned may be trademarks or registered trademarks of their respective owners