Red Hat Training
A Red Hat training course is available for Red Hat Fuse
第 15 章 与 Apache ActiveMQ 集成
概述
如果您使用 Apache ActiveMQ 作为 JMS 提供程序,可以以特殊格式指定目的地的 JNDI 名称,以便为队列或主题动态创建 JNDI 绑定。这意味着 不需要 预先使用队列或主题的 JNDI 绑定配置 JMS 提供程序。
初始上下文工厂
将 Apache ActiveMQ 与 JNDI 集成的关键是 ActiveMQInitialContextFactory 类。此类用于创建 JNDI InitialContext 实例,然后您可以使用它来访问 JMS 代理中的 JMS 目的地。
例 15.1 “用于连接到 Apache ActiveMQ 的 SOAP/JMS WSDL” 显示 SOAP/JMS WSDL 扩展以创建与 Apache ActiveMQ 集成的 JNDI InitialContext。
例 15.1. 用于连接到 Apache ActiveMQ 的 SOAP/JMS WSDL
<soapjms:jndiInitialContextFactory> org.apache.activemq.jndi.ActiveMQInitialContextFactory </soapjms:jndiInitialContextFactory> <soapjms:jndiURL>tcp://localhost:61616</soapjms:jndiURL>
在 例 15.1 “用于连接到 Apache ActiveMQ 的 SOAP/JMS WSDL” 中,Apache ActiveMQ 客户端连接到位于 tcp://localhost:61616 的代理端口。
查找连接工厂
此外,还要创建 JNDI InitialContext 实例,您必须指定绑定到 javax.jms.ConnectionFactory 实例的 JNDI 名称。如果是 Apache ActiveMQ,则 InitialContext 实例中有一个预定义绑定,它将 JNDI 名称 ConnectionFactory 映射到 ActiveMQConnectionFactory 实例。例 15.2 “用于指定 Apache ActiveMQ 连接工厂的 SOAP/JMS WSDL” 用于指定 Apache ActiveMQ 连接工厂的 SOAP/JMS 扩展元素。
例 15.2. 用于指定 Apache ActiveMQ 连接工厂的 SOAP/JMS WSDL
<soapjms:jndiConnectionFactoryName> ConnectionFactory </soapjms:jndiConnectionFactoryName>
动态目的地的语法
要动态访问队列或主题,请将目的地的 JNDI 名称指定为 JNDI 复合名称,采用以下格式之一:
dynamicQueues/QueueName dynamicTopics/TopicName
QueueName 和 TopicName 是 Apache ActiveMQ 代理使用的名称。它们不 抽象 JNDI 名称。
例 15.3 “带有动态创建的队列的 WSDL 端口规格” 显示使用动态创建的队列的 WSDL 端口。
例 15.3. 带有动态创建的队列的 WSDL 端口规格
<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>
当应用尝试打开 JMS 连接时,Apache ActiveMQ 将检查是否存在 JNDI 名称 greeter.request.queue 的队列。如果不存在,它将创建新队列,并将它绑定到 JNDI 名称 greeter.request.queue。