If you are using Fuse Message Broker or Apache ActiveMQ as your JMS provider, the JNDI name of your destinations can be specified in a special format that dynamically creates JNDI bindings for queues or topics. This means that it is not necessary to configure the JMS provider in advance with the JNDI bindings for your queues or topics.
The key to integrating Fuse Message Broker or ā with JNDI is the
ActiveMQInitialContextFactory
class. This class is used to create a
JNDI InitialContext
instance, which you can then use to access JMS
destinations in the JMS broker.
Example A.1 shows SOAP/JMS WSDL extensions to create a JNDI
InitialContext
that is integrated with Fuse Message Broker.
Example A.1. SOAP/JMS WSDL to connect to Fuse Message Broker
<soapjms:jndiInitialContextFactory> org.apache.activemq.jndi.ActiveMQInitialContextFactory </soapjms:jndiInitialContextFactory> <soapjms:jndiURL>tcp://localhost:61616</soapjms:jndiURL>
In Example A.1, the Fuse Message Broker client connects to the broker
port located at tcp://localhost:61616
.
As well as creating a JNDI InitialContext
instance, you must
specify the JNDI name that is bound to a javax.jms.ConnectionFactory
instance. In the case of Fuse Message Broker and Apache ActiveMQ, there is a predefined binding in the
InitialContext
instance, which maps the JNDI name
ConnectionFactory
to an ActiveMQConnectionFactory
instance. Example A.2 shaows the SOAP/JMS extension element for
specifying the Fuse Message Broker connection factory.
Example A.2. SOAP/JMS WSDL for specifying the Fuse Message Broker connection factory
<soapjms:jndiConnectionFactoryName> ConnectionFactory </soapjms:jndiConnectionFactoryName>
To access queues or topics dynamically, specify the destination's JNDI name as a JNDI composite name in either of the following formats:
dynamicQueues/QueueName
dynamicTopics/TopicName
QueueName
and TopicName
are
the names that the Apache ActiveMQ broker uses. They are not abstract JNDI
names.
Example A.3 shows a WSDL port that uses a dynamically created queue.
Example A.3. WSDL port specification with a dynamically created queue
<service name="JMSService"> <port binding="tns:GreeterBinding" name="JMSPort"> <jms:address jndiConnectionFactoryName="ConnectionFactory" jndiDestinationName="dynamicQueues/greeter.request.queue" > <jms:JMSNamingProperty name="java.naming.factory.initial" value="org.activemq.jndi.ActiveMQInitialContextFactory" /> <jms:JMSNamingProperty name="java.naming.provider.url" value="tcp://localhost:61616" /> </jms:address> </port> </service>
When the application attempts to open the JMS connection, Fuse Message Broker will check to see if
a queue with the JNDI name greeter.request.queue
exists. If it does not exist,
it will create a new queue and bind it to the JNDI name
greeter.request.queue
.