14.5. 使用 WSDL 配置 JMS
14.5.1. JMS WSDL 扩展名称
用于定义 JMS 端点的 WSDL 扩展在命名空间 http://cxf.apache.org/transports/jms 中定义。要使用 JMS 扩展,您需要将 例 14.5 “JMS WSDL 扩展命名空间” 中显示的行添加到合同的定义元素中。
例 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
元素与配置文件中使用的相同。其属性列在 表 14.2 “JMS 端点属性” 中。
属性 | 描述 |
---|---|
指定 JMS 目的地是否为 JMS 队列或 JMS 主题。 | |
指定连接到 JMS 目的地时要使用的 JMS 连接工厂的 JNDI 名称。 | |
指定将请求发送到的 JMS 目的地的名称。 | |
指定发送回复的 JMS 目的地的 JMS 名称。此属性允许您使用用户定义的目的地来回复。详情请查看 第 14.6 节 “使用 Named Reply Destination”。 | |
指定绑定到请求发送到的 JMS 目的地的 JNDI 名称。 | |
指定与发送回复的 JMS 目的地的 JNDI 名称。此属性允许您使用用户定义的目的地来回复。详情请查看 第 14.6 节 “使用 Named 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 邮件正文中的数据并检索数据。发送消息时,消息数据(包括任何格式信息)被打包成 字节[]
,并在将消息正文放置在线路上前将其放在消息正文中。收到消息时,使用者端点将尝试解包消息正文中存储的数据,就像将其打包在 字节[]
中一样。
在使用 text Message
时,使用者端点使用字符串作为来自消息正文的数据的方法。发送消息时,消息信息(包括任何格式的信息)将转换为字符串,并放入 JMS 消息正文。收到消息时,使用者端点将尝试解包在 JMS 消息正文中存储的数据,就像将其打包成字符串一样。
当原生 JMS 应用与 Apache CXF 消费者交互时,JMS 应用负责解释消息和格式化信息。例如,如果 Apache CXF 合同指定用于 JMS 端点的绑定是 SOAP,且消息将被打包为 text Message
,接收 JMS 应用会得到一个包含所有 SOAP envelope 信息的文本信息。
指定消息类型
JMS 使用者端点接受的消息类型通过可选的 jms:client
元素进行配置。jms:client
元素是 WSDL 端口
元素的子项,并具有一条属性:
指定消息数据如何打包为 JMS 消息。文本指定数据将打包为 |
示例
例 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
元素的子项,具有下列属性:
属性 | 描述 |
---|---|
指定 JMS 是否将使用消息 ID 来关联消息。默认值为 | |
指定注册持久订阅的名称。 | |
指定要使用的消息选择器的字符串值。有关使用指定选择器的语法的更多信息,请参阅 JMS 1.1 规格。 | |
指定本地 JMS 代理是否围绕消息处理创建事务。默认值为 | |
示例
例 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>