13.2. JMS URI


概述

使用 SOAP/JMS 时,使用 JMS URI 指定端点的目标目的地。JMS URI 也可以通过将一个或多个选项附加到 URI 来配置 JMS 连接。这些选项在 IETF 标准、Java 消息服务 1.0 的 URI Scheme 中详细介绍。它们可用于配置 JNDI 系统、回复目的地、要使用的交付模式和其他 JMS 属性。

语法

例 13.4 “JMS URI 选项的语法” 所示,您可以将一个或多个选项附加到 JMS URI 的末尾,方法是将它们与带有问号(?)的目标地址分开来。多个选项由一个 符号( 和 )分隔。例 13.4 “JMS URI 选项的语法” 显示在 JMS URI 中使用多个选项的语法。

例 13.4. JMS URI 选项的语法

jms:variant:jmsAddress?option1=value1&option2=value2&_optionN_=valueN

JMS 属性

表 13.2 “JMS 属性 settable 为 URI 选项” 显示影响 JMS 传输层的 URI 选项。

表 13.2. JMS 属性 settable 为 URI 选项
属性默认描述

conduitIdSelectorPrefix

 

[可选] 前缀为 conduit 创建的所有关联 ID 的字符串值。选择器可以使用它来侦听回复。

deliveryMode

持久性

指定是否使用 JMS PERSISTENTNON_PERSISTENT 消息语义。对于 PERSISTENT 传输模式,JMS 代理会在确认它们之前将消息存储在持久存储中;而 NON_PERSISTENT 消息仅保存在内存中。

durableSubscriptionClientID

 

[可选] 指定连接的客户端标识符。此属性用于将连接与供应商代表客户端维护的状态关联。这可让后续具有相同身份的订阅者恢复之前订阅者保留的状态。

durableSubscriptionName

 

[可选] 指定订阅的名称。

messageType

byte

指定 CXF 使用的 JMS 消息类型。有效值为:

  • byte
  • text
  • 二进制

password

 

[可选] 指定创建连接的密码。不建议将此属性附加到 URI 中。

priority

4

指定 JMS 消息优先级,范围从 0 (最低)到 9 (最高)。

receiveTimout

60000

指定使用请求/回复交换时客户端将等待回复的时间,以毫秒为单位。

reconnectOnException

true

[在 CXF 3.0 中弃用] 指定在发生异常时传输是否应重新连接。

从 3.0 开始,当发生异常时,传输始终重新连接。

replyToName

 

[可选] 指定队列消息的回复目的地。回复目的地会出现在 JMSReplyTo 标头中。建议为具有 request-reply 语义的应用程序设置此属性,因为如果未指定,则 JMS 提供程序将分配一个临时回复队列。

此属性的值根据 JMS URI 中指定的变体进行解释:

  • JNDI 变体 - 由 JNDI 解析的目标队列的名称
  • 队列 变体 - 使用 JMS 解析的目标队列的名称

sessionTransacted

false

指定事务类型。有效值为:

  • true-resource 本地事务
  • false-JTA 事务

timeToLive

0

指定 JMS 提供程序将丢弃邮件的时间(以毫秒为单位)。值 0 表示无限生命周期。

topicReplyToName

 

[可选] 指定主题消息的回复目的地。此属性的值根据 JMS URI 中指定的变体进行解释:

  • JNDI-topic- 被 JNDI 解析的目标主题的名称
  • topic- JMS 解析的目标主题的名称

useConduitIdSelector

true

指定哪个 UUID 是否用作所有关联 ID 的前缀。

由于所有行为都被分配了唯一的 UUID,请将此属性设置为 true 可启用多个端点来共享 JMS 队列或主题。

username

 

[可选] 指定用于创建连接的用户名。

JNDI 属性

表 13.3 “JNDI properties settable as URI options” 显示可用于为此端点配置 JNDI 的 URI 选项。

表 13.3. JNDI properties settable as URI options
属性描述

jndiConnectionFactoryName

指定 JMS 连接工厂的 JNDI 名称。

jndiInitialContextFactory

指定 JNDI 提供程序的完全限定 Java 类名称(它必须是 javax.jms.InitialContextFactory 类型)。等同于设置 java.naming.factory.initial Java 系统属性。

jndiTransactionManagerName

指定在 Spring、Blueprint 或 JNDI 中搜索的 JTA 事务管理器的名称。如果找到了事务管理器,则会启用 JTA 事务。请参阅 sessionTransacted JMS 属性。

jndiURL

指定初始化 JNDI 供应商的 URL。等同于设置 java.naming.provider.url Java 系统属性。

额外的 JNDI 属性

属性 java.naming.factory.initialjava.naming.provider.url 是标准属性,这是初始化任何 JNDI 提供程序所需的标准属性。但是,除了标准属性外,JNDI 提供程序还可能支持自定义属性。在这种情况下,您可以通过设置 jndi-PropertyName 格式的 URI 选项来设置任意 JNDI 属性。

例如,如果您使用 SUN 的 LDAP 实现的 JNDI,您可以在 JMS URI 中设置 JNDI 属性 java.naming.factory.control,如 例 13.5 “在 JMS URI 中设置 JNDI 属性” 所示。

例 13.5. 在 JMS URI 中设置 JNDI 属性

jms:queue:FOO.BAR?jndi-java.naming.factory.control=com.sun.jndi.ldap.ResponseControlFactory

示例

如果 JMS 提供程序尚未配置,则可以在 URI 中使用选项提供必要的 JNDI 配置详情(请参阅 表 13.3 “JNDI properties settable as URI options”)。例如,若要配置端点以使用 Apache ActiveMQ JMS 提供程序并连接到名为 test.cxf.jmstransport.queue 的队列,请使用 例 13.6 “配置 JNDI 连接的 JMS URI” 中显示的 URI。

例 13.6. 配置 JNDI 连接的 JMS URI

jms:jndi:dynamicQueues/test.cxf.jmstransport.queue
?jndiInitialContextFactory=org.apache.activemq.jndi.ActiveMQInitialContextFactory
&jndiConnectionFactoryName=ConnectionFactory
&jndiURL=tcp://localhost:61616

发布服务

JAX-WS 标准 publish () 方法无法用于发布 SOAP/JMS 服务。反之,您必须使用 Apache CXF 的 JaxWsServerFactoryBean 类,如 例 13.7 “发布 SOAP/JMS 服务” 所示。

例 13.7. 发布 SOAP/JMS 服务

String address = "jms:jndi:dynamicQueues/test.cxf.jmstransport.queue3"
    + "?jndiInitialContextFactory"
    + "=org.apache.activemq.jndi.ActiveMQInitialContextFactory"
    + "&jndiConnectionFactoryName=ConnectionFactory"
    + "&jndiURL=tcp://localhost:61500";
Hello implementor = new HelloImpl();
JaxWsServerFactoryBean svrFactory = new JaxWsServerFactoryBean();
svrFactory.setServiceClass(Hello.class);
svrFactory.setAddress(address);
svrFactory.setTransportId(JMSSpecConstants.SOAP_JMS_SPECIFICIATION_TRANSPORTID);
svrFactory.setServiceBean(implementor);
svrFactory.create();

例 13.7 “发布 SOAP/JMS 服务” 中的代码执行以下操作:

创建代表 t he 端点地址的 JMS URI。

实例化 JaxWsServerFactoryBean 来发布该服务。

使用服务的 JMS URI 设置 factory bean 的 address 字段。

指定工厂创建的服务将使用 SOAP/JMS 传输。

使用服务

标准 JAX-WS API 无法用于使用 SOAP/JMS 服务。反之,您必须使用 Apache CXF 的 JaxWsProxyFactoryFactoryBean 类,如 例 13.8 “使用 SOAP/JMS 服务” 所示。

例 13.8. 使用 SOAP/JMS 服务

// Java
public void invoke() throws Exception {
    String address = "jms:jndi:dynamicQueues/test.cxf.jmstransport.queue3"
        + "?jndiInitialContextFactory"
        + "=org.apache.activemq.jndi.ActiveMQInitialContextFactory"
        + "&jndiConnectionFactoryName=ConnectionFactory&jndiURL=tcp://localhost:61500";
    JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
    factory.setAddress(address);
    factory.setTransportId(JMSSpecConstants.SOAP_JMS_SPECIFICIATION_TRANSPORTID);
    factory.setServiceClass(Hello.class);
    Hello client = (Hello)factory.create();
    String reply = client.sayHi(" HI");
    System.out.println(reply);
}

例 13.8 “使用 SOAP/JMS 服务” 中的代码执行以下操作:

创建代表 t he 端点地址的 JMS URI。

实例化 JaxWsProxyFactoryBean 来创建代理。

使用服务的 JMS URI 设置 factory bean 的 address 字段。

指定工厂创建的代理将使用 SOAP/JMS 传输。

Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.