14.5. 使用 WSDL 配置 JMS
14.5.1. JMS WSDL 扩展名称spance
用于定义 JMS 端点的 WSDL 扩展在命名空间 http://cxf.apache.org/transports/jms 中定义。要使用 JMS 扩展,您需要将 例 14.5 “JMS WSDL 扩展命名空间” 中显示的行添加到您的合同的 definitions 元素中。
例 14.5. JMS WSDL 扩展命名空间
xmlns:jms="http://cxf.apache.org/transports/jms"
14.5.2. 基本 JMS 配置
概述
JMS 地址信息使用 jms:address 元素及其子级提供,jms:JMSNamingProperties 元素。jms:address 元素的属性指定识别 JMS 代理和目的地所需的信息。jms:JMSNamingProperties 元素指定用于连接 JNDI 服务的 Java 属性。
使用 JMS 功能指定的信息将覆盖端点的 WSDL 文件中的信息。
指定 JMS 地址
JMS 端点的基本配置通过将 jms:address 元素用作 服务端口 元素的子级来完成。WSDL 中使用的 jms:address 元素与配置文件中使用的 jms:address 元素相同。其属性列在 表 14.2 “JMS 端点属性” 中。
表 14.2. JMS 端点属性
| 属性 | 描述 |
|---|---|
| 指定 JMS 目标是否为 JMS 队列或 JMS 主题。 | |
| 指定连接到 JMS 目的地时要使用的 JMS 连接工厂的 JNDI 名称。 | |
| 指定发送请求的 JMS 目的地的 JMS 名称。 | |
| 指定发送回复的 JMS 目的地的名称。此属性允许您使用定义的用户进行回复的目的地。详情请查看 第 14.6 节 “使用命名的 Reply Destination”。 | |
| 指定绑定到将请求发送到的 JMS 目的地的 JNDI 名称。 | |
| 指定发送到回复的 JMS 目的地的 JNDI 名称。此属性允许您使用定义的用户进行回复的目的地。详情请查看 第 14.6 节 “使用命名的 Reply Destination”。 | |
| 指定连接到 JMS 代理时使用的用户名。 | |
| 指定连接到 JMS 代理时要使用的密码。 |
jms:address WSDL 元素使用 jms:JMSNamingProperties 子元素来指定连接到 JNDI 提供程序所需的其他信息。
指定 JNDI 属性
为提高与 JMS 和 JNDI 提供程序的互操作性,jms:address 元素具有子元素 jms:JMSNamingProperties,允许您指定用于填充连接到 JNDI 提供程序时使用的属性的值。jms:JMSNamingProperties 元素有两个属性: name 和 value。name 指定要设置的属性的名称。value 属性指定指定属性的值。jms:JMSNamingProperties 元素也可用于指定提供程序特定属性。
以下是可设置的常用 JNDI 属性列表:
-
java.naming.factory.initial -
java.naming.provider.url -
java.naming.factory.object -
java.naming.factory.state -
java.naming.factory.url.pkgs -
java.naming.dns.url -
java.naming.authoritative -
java.naming.batchsize -
java.naming.referral -
java.naming.security.protocol -
java.naming.security.authentication -
java.naming.security.principal -
java.naming.security.credentials -
java.naming.language -
java.naming.applet
有关这些属性中要使用的信息的更多详细信息,请检查您的 JNDI 提供程序文档,并查阅 Java API 参考材料。
示例
例 14.6 “JMS WSDL 端口规格” 显示 JMS WSDL 端口 规范的示例。
例 14.6. JMS WSDL 端口规格
<service name="JMSService">
<port binding="tns:Greeter_SOAPBinding" name="SoapPort">
<jms:address jndiConnectionFactoryName="ConnectionFactory"
jndiDestinationName="dynamicQueues/test.Celtix.jmstransport" >
<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>14.5.3. JMS 客户端配置
概述
JMS 消费者端点指定它们使用的消息类型。JMS 消费者端点可以使用 JMS ByteMessage 或 JMS TextMessage。
使用 ByteMessage 时,消费者端点使用 byte[] 作为将数据存储到 JMS 消息正文并检索数据的方法。发送消息后,消息数据(包括任何格式信息)被打包成一个 字节[],并在其放置在线上之前将其放入消息正文中。收到消息后,消费者端点将尝试 unmarshall 消息正文中存储的数据,就如同将其打包为 byte[] 一样。
使用 TextMessage 时,消费者端点使用字符串作为从消息正文存储和检索数据的方法。发送消息后,消息信息(包括任何格式特定信息)将转换为字符串,并放入 JMS 消息正文中。收到消息时,消费者端点将尝试 unmarshall 存储在 JMS 消息正文中的数据,就如同将其打包成字符串一样。
当原生 JMS 应用程序与 Apache CXF 用户交互时,JMS 应用程序负责解释消息和格式信息。例如,如果 Apache CXF 合同指定用于 JMS 端点的绑定是 SOAP,并且消息被打包为 TextMessage,则接收 JMS 应用会收到包含所有 SOAP envelope 信息的文本消息。
指定消息类型
JMS 消费者端点接受的消息类型使用可选的 jms:client 元素进行配置。jms:client 元素是 WSDL 端口 元素的子级,它有一个属性:
示例
例 14.7 “用于 JMS 使用者端点的 WSDL” 显示用于配置 JMS 使用者端点的 WSDL。
例 14.7. 用于 JMS 使用者端点的 WSDL
<service name="JMSService">
<port binding="tns:Greeter_SOAPBinding" name="SoapPort">
<jms:address jndiConnectionFactoryName="ConnectionFactory"
jndiDestinationName="dynamicQueues/test.Celtix.jmstransport" >
<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>
<jms:client messageType="binary" />
</port>
</service>14.5.4. JMS 供应商配置
概述
JMS 提供程序端点具有许多可以配置的行为。它们是:
- 消息关联方式
- 使用持久订阅
- 如果服务使用本地 JMS 事务
- 端点使用的消息选择器
指定配置
提供程序端点行为使用可选的 jms:server 元素进行配置。jms:server 元素是 WSDL wsdl:port 元素的子级,具有以下属性:
示例
例 14.8 “用于 JMS 提供程序端点的 WSDL” 显示用于配置 JMS 提供程序端点的 WSDL。
例 14.8. 用于 JMS 提供程序端点的 WSDL
<service name="JMSService">
<port binding="tns:Greeter_SOAPBinding" name="SoapPort">
<jms:address jndiConnectionFactoryName="ConnectionFactory"
jndiDestinationName="dynamicQueues/test.Celtix.jmstransport" >
<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>
<jms:server messageSelector="cxf_message_selector"
useMessageIDAsCorrelationID="true"
transactional="true"
durableSubscriberName="cxf_subscriber" />
</port>
</service>