13.2. JMS URI
概述
使用 SOAP/JMS 时,使用 JMS URI 指定端点的目标目的地。JMS URI 也可用于配置 JMS 连接,方法是在 URI 中附加一个或多个选项。这些选项在 IETF 标准中详述,Java Message Service 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 属性设置为 URI 选项” 显示影响 JMS 传输层的 URI 选项。
属性 | 默认 | 描述 |
---|---|---|
| [可选] 是一个字符串值,前缀为 conduit 创建的所有关联 ID。选择器可以使用它来监听回复。 | |
|
|
指定是否使用 JMS |
| [可选] 指定连接的客户端标识符。此属性用于将连接与提供程序代表客户端维护的状态相关联。这可让带有同一身份的后续订阅者恢复其前面订阅的状态。 | |
| [可选] 指定订阅的名称。 | |
|
| 指定 CXF 使用的 JMS 消息类型。有效值为:
|
| [可选] 指定创建连接的密码。不建议将此属性附加到 URI。 | |
|
| 指定 JMS 消息优先级,范围从 0 (最低)到 9 (最高)。 |
|
| 指定时间,以毫秒为单位,在使用请求/重新交换时,客户端会等待回复。 |
|
| [弃用在 CXF 3.0] 中,指定在出现异常时传输是否应重新连接。 从 3.0 开始,传输会在异常发生时始终重新连接。 |
|
[可选] 指定队列消息的回复目的地。回复目的地会出现在 此属性的值根据 JMS URI 中指定的变体进行解释:
| |
|
| 指定事务类型。有效值为:
|
|
|
指定 JMS 提供程序丢弃消息的时间(以毫秒为单位)。 |
| [可选] 指定主题消息的回复目的地。此属性的值根据 JMS URI 中指定的变体进行解释:
| |
|
| 指定 conduit 的 UUID 将用作所有关联 ID 的前缀。
由于所有 conduit 都分配有唯一 UUID,请将此属性设置为 |
| [可选] 指定用于创建连接的用户名。 |
JNDI 属性
表 13.3 “JNDI 属性 settable 作为 URI 选项” 显示可用于配置此端点 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,您可以设置 JNDI 属性 java.naming.factory.control
,在 JMS URI 中,如 例 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 属性 settable 作为 URI 选项”)。例如,若要将端点配置为使用 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 标准 发布()
方法无法用于发布 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 服务” 中的代码执行以下操作:
创建代表端点地址的 JMS URI。
将 JaxWsServerFactoryBean
实例化以发布服务。
使用服务的 JMS URI 设置 factory bean 的 address
字段。
指定工厂创建的服务将使用 SOAP/JMS 传输。
消耗服务
标准 JAX-WS API 无法用于使用 SOAP/JMS 服务。反之,您必须使用 Apache CXF 的 JaxWsProxyFactoryBean
类,如 例 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 服务” 中的代码执行以下操作:
创建代表端点地址的 JMS URI。
将 JaxWsProxyFactoryBean
实例化以创建代理。
使用服务的 JMS URI 设置 factory bean 的 address
字段。
指定工厂创建的代理将使用 SOAP/JMS 传输。