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 选项。
属性 | 默认 | 描述 |
---|---|---|
| [可选] 前缀为 conduit 创建的所有关联 ID 的字符串值。选择器可以使用它来侦听回复。 | |
|
|
指定是否使用 JMS |
| [可选] 指定连接的客户端标识符。此属性用于将连接与供应商代表客户端维护的状态关联。这可让后续具有相同身份的订阅者恢复之前订阅者保留的状态。 | |
| [可选] 指定订阅的名称。 | |
|
| 指定 CXF 使用的 JMS 消息类型。有效值为:
|
| [可选] 指定创建连接的密码。不建议将此属性附加到 URI 中。 | |
|
| 指定 JMS 消息优先级,范围从 0 (最低)到 9 (最高)。 |
|
| 指定使用请求/回复交换时客户端将等待回复的时间,以毫秒为单位。 |
|
| [在 CXF 3.0 中弃用] 指定在发生异常时传输是否应重新连接。 从 3.0 开始,当发生异常时,传输始终重新连接。 |
|
[可选] 指定队列消息的回复目的地。回复目的地会出现在 此属性的值根据 JMS URI 中指定的变体进行解释:
| |
|
| 指定事务类型。有效值为:
|
|
|
指定 JMS 提供程序将丢弃邮件的时间(以毫秒为单位)。值 |
| [可选] 指定主题消息的回复目的地。此属性的值根据 JMS URI 中指定的变体进行解释:
| |
|
| 指定哪个 UUID 是否用作所有关联 ID 的前缀。
由于所有行为都被分配了唯一的 UUID,请将此属性设置为 |
| [可选] 指定用于创建连接的用户名。 |
JNDI 属性
表 13.3 “JNDI properties settable as URI options” 显示可用于为此端点配置 JNDI 的 URI 选项。
属性 | 描述 |
---|---|
| 指定 JMS 连接工厂的 JNDI 名称。 |
|
指定 JNDI 提供程序的完全限定 Java 类名称(它必须是 |
|
指定在 Spring、Blueprint 或 JNDI 中搜索的 JTA 事务管理器的名称。如果找到了事务管理器,则会启用 JTA 事务。请参阅 |
|
指定初始化 JNDI 供应商的 URL。等同于设置 |
额外的 JNDI 属性
属性 java.naming.factory.initial
和 java.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 传输。