Red Hat Training

A Red Hat training course is available for Red Hat Fuse

14.2. 使用 JMS 配置 bean

概述

为简化 JMS 配置并使其强大,Apache CXF 使用单一 JMS 配置 Bean 配置 JMS 端点。bean 通过 org.apache.cxf.transport.jms.JMSConfiguration 类来实施。它可用于直接配置端点,或者配置 JMS conduits 和目的地。

配置命名空间

JMS 配置 bean 使用 Spring p-namespace 尽可能简单。要使用这个命名空间,您需要在配置的根元素中声明它,如 例 14.1 “声明 Spring p-namespace” 所示。

例 14.1. 声明 Spring p-namespace

<beans ...
  xmlns:p="http://www.springframework.org/schema/p"
  ... >
  ...
</beans>

指定配置

您可以通过定义 bean 类 org.apache.cxf.transport.jms.JMSConfiguration 来指定 JMS 配置。Bean 的属性提供传输的配置设置。

重要

在 CXF 3.0 中,JMS 传输不再依赖于 Spring JMS,因此删除了一些 Spring JMS 相关的选项。

表 14.1 “常规 JMS 配置属性” 列出提供商和消费者常用的属性。

表 14.1. 常规 JMS 配置属性

属性默认描述

connectionFactory

 

[required] 指定定义 JMS ConnectionFactory 的 bean 的引用。

wrapInSingleConnectionFactory

true [pre v3.0]

在 CXF 3.0 中删除

pre CXF 3.0 指定是否将 ConnectionFactory 替换为 Spring SingleConnectionFactory

在使用不含池连接的 ConnectionFactory 时启用此属性,因为它将提高 JMS 传输的性能。因此,因为 JMS 传输为每个消息创建一个新连接,并且 SingleConnectionFactory 需要缓存连接,因此可以重复使用它。

reconnectOnException

false

在 CXF 3.0 CXF 中已弃用,总是在异常时重新连接。

pre CXF 3.0 指定在出现异常时是否创建新连接。

使用 Spring SingleConnectionFactory 嵌套 ConnectionFactory 时:

  • true TOKEN-TOKENon a exception, 创建新连接

    在使用 PooledConnectionFactory 时不要启用这个选项,因为这个选项只返回池的连接,但不会重新连接。

  • 例外情况为 false 的 TOKEN- lpron,不要尝试重新连接

targetDestination

 

指定目的地的 JNDI 名称或特定于提供程序的名称。

replyDestination

 

指定发送回复的 JMS 目的地的 JMS 名称。此属性允许使用用户定义的目的地进行回复。详情请查看 第 14.6 节 “使用 Named Reply Destination”

destinationResolver

DynamicDestinationResolver

指定 Spring DestinationResolver 的引用。

通过此属性,您可以定义目标名称如何解析为 JMS 目的地。有效值为:

  • 使用 JMS 提供程序的功能,DestinationResolver solv-resolve 目的地名称。
  • 使用 JNDI 进行 JndiDestinationResolver WWN-resolve 目的地名称。

transactionManager

 

指定 Spring 事务管理器的引用。这使得该服务能够参与 JTA 事务。

taskExecutor

SimpleAsyncTaskExecutor

在 CXF 3.0 中删除

pre CXF 3.0 指定对 Spring TaskExecutor 的引用。这用于监听器来确定如何处理传入的信息。

useJms11

false

在 CXF 3.0 中删除,CXF 3.0 仅支持 JMS 1.1 功能。

pre CXF 3.0 指定是否使用 JMS 1.1 功能。有效值为:

  • true TOKEN-JMSJMS 1.1 功能
  • false — JMS 1.0.2 features

messageIdEnabled

true

在 CXF 3.0 中删除

pre CXF 3.0 指定 JMS 传输是否希望 JMS 代理来提供消息 ID。有效值为:

  • true containerruntime-keyringbroker 需要提供消息 ID
  • false WWN-broker 需要提供消息 ID

    在本例中,端点将调用消息 producer 的 setDisableMessageID () 方法,值为 true。然后,为代理提供一个提示,它不需要生成消息 ID,或将其添加到端点的消息中。代理可以接受 hint 或忽略它。

messageTimestampEnabled

true

在 CXF 3.0 中删除

pre CXF 3.0 指定 JMS 传输是否希望 JMS 代理提供消息时间戳。有效值为:

  • true WWN-keyringbroker 需要提供消息时间戳
  • false 的 WWN-BUFFERbroker 不需要提供消息时间戳

    在本例中,端点将调用消息 producer 的 setDisableMessageTimestamp () 方法,值为 true。然后,为代理提供一个提示,它不需要生成时间戳或将其添加到端点的消息中。代理可以接受 hint 或忽略它。

cacheLevel

-1 ( 禁用功能)

在 CXF 3.0 中删除

pre CXF 3.0 指定 JMS 侦听器容器可以应用的缓存级别。有效值为:

  • 0 — CACHE_NONE
  • 1 — CACHE_CONNECTION
  • 2 — CACHE_SESSION
  • 3 — CACHE_CONSUMER
  • 4 — CACHE_AUTO

详情请参阅 Class DefaultMessageListenerContainer

pubSubNoLocal

false

指定在使用主题时是否接收您自己的消息。

  • true TOKEN- lprdo 没有接收您自己的信息
  • false WWN-receive 您自己的消息

receiveTimeout

60000

指定响应消息的时间(毫秒)。

explicitQosEnabled

false

指定是否明确为每条消息(true)或默认值(false)设置 QoS 设置(如 priority、persistent 和 time to live)。

deliveryMode

2

指定消息是否持久。有效值为:

  • 1 ( NON_PERSISTENT)-messages 只保留内存
  • 2 (PERSISTENT)-messages 会保留给磁盘

priority

4

指定消息优先级。JMS 优先级值范围从 0 ( 最低)到 9 (最高)。详情请参阅您的 JMS 供应商的文档。

timeToLive

0 (indefinitely)

在丢弃了消息之前,以毫秒为单位指定时间。

sessionTransacted

false

指定是否使用 JMS 事务。

concurrentConsumers

1

在 CXF 3.0 中删除

pre CXF 3.0 指定监听器的最小并发用户数量。

maxConcurrentConsumers

1

在 CXF 3.0 中删除

pre CXF 3.0 指定监听器的最大并发用户数量。

messageSelector

 

指定用于过滤传入消息的选择器的字符串值。这个属性可让多个连接共享一个队列。如需有关用于指定消息选择器的语法的更多信息,请参阅 JMS 1.1 规范

subscriptionDurable

false

指定服务器是否使用 durable 订阅。

durableSubscriptionName

 

指定用于注册持久订阅的名称(字符串)。

messageType

text

指定消息数据将如何打包为 JMS 消息。有效值为:

  • text WWN-WWNspec 表示该数据将打包为 文本消息
  • byte horizon-encryptspec 表示数据将打包为一个字节数组(byte[])
  • 二进制 WWN-WWNspec 表示该数据将打包为一个 ByteMessage

pubSubDomain

false

指定目标目的地是主题还是一个队列。有效值为:

  • true ALLOW-topictopic
  • false — queue

jmsProviderTibcoEms

false

指定 JMS 提供程序是否为 Tibco EMS。

当设置为 true 时,安全性上下文中的主体会填充来自 JMS_TIBCO_SENDER 标头。

useMessageIDAsCorrelationID

false

在 CXF 3.0 中删除

指定 JMS 是否将使用消息 ID 来关联消息。

当设置为 true 时,客户端会设置生成的关联 ID。

maxSuspendedContinuations

-1 ( 禁用功能)

CXF 3.0 指定 JMS 目标可能具有的最大暂停数。当当前数量超过指定的最大值时,JMSListenerContainer 将停止。

reconnectPercentOfMax

70

CXF 3.0 指定在超过 maxSuspendedContinuations 时重启 JMSListenerContainer 停止的时间。

当其当前暂停的延续数低于 的值时 (maxSuspendedContinuations * reconnectPercentOfMax/100),则监听器容器将重启

例 14.2 “JMS 配置 bean” 所示,bean 的属性被指定为 bean 元素的属性。它们都在 Spring p 命名空间中声明。

例 14.2. JMS 配置 bean

<bean id="jmsConfig"
      class="org.apache.cxf.transport.jms.JMSConfiguration"
      p:connectionFactory="jmsConnectionFactory"
      p:targetDestination="dynamicQueues/greeter.request.queue"
      p:pubSubDomain="false" />

将配置应用到端点

JMSConfiguration bean 可以使用 Apache CXF 功能机制直接应用于服务器和客户端端点。要做到这一点:

  1. 将端点的 address 属性设置为 jms://
  2. jaxws:feature 元素添加到端点的配置。
  3. 向 功能添加 bean 类型的 org.apache.cxf.transport.jms.JMSConfigFeature
  4. bean 元素的 p:jmsConfig-ref 属性设置为 JMSConfiguration bean 的 ID。

例 14.3 “将 JMS 配置添加到 JAX-WS 客户端” 显示使用来自 例 14.2 “JMS 配置 bean” 的 JMS 配置的 JAX-WS 客户端。

例 14.3. 将 JMS 配置添加到 JAX-WS 客户端

<jaxws:client id="CustomerService"
              xmlns:customer="http://customerservice.example.com/"
              serviceName="customer:CustomerServiceService"
              endpointName="customer:CustomerServiceEndpoint"
              address="jms://"
              serviceClass="com.example.customerservice.CustomerService">
  <jaxws:features>
    <bean xmlns="http://www.springframework.org/schema/beans"
          class="org.apache.cxf.transport.jms.JMSConfigFeature"
          p:jmsConfig-ref="jmsConfig"/>
  </jaxws:features>
</jaxws:client>

将配置应用到传输

JMSConfiguration bean 可以使用 jms:jmsConfig-ref 元素应用到 JMS conduits 和 JMS 目的地。jms:jmsConfig-ref 元素的值是 JMSConfiguration bean 的 ID。

例 14.4 “在 JMS conduit 中添加 JMS 配置” 显示使用 例 14.2 “JMS 配置 bean” 中的 JMS 配置的 JMS conduit。

例 14.4. 在 JMS conduit 中添加 JMS 配置

<jms:conduit name="{http://cxf.apache.org/jms_conf_test}HelloWorldQueueBinMsgPort.jms-conduit">
  ...
  <jms:jmsConfig-ref>jmsConf</jms:jmsConfig-ref>
</jms:conduit>