14.2. 使用 JMS 配置 bean

概述

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

配置命名空间

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>

指定配置

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

重要

在 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 中删除

预先 CXF 3.0 指定是否将 ConnectionFactory 与 Spring SingleConnectionFactory 换行。

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

reconnectOnException

false

发生异常时,CXF 中已弃用 CXF 始终重新连接。

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

使用 Spring SingleConnectionFactory 嵌套 ConnectionFactory 时:

  • 对一个例外情况进行 true busybox,创建一个新连接

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

  • 异常错误,错误,不要尝试重新连接

targetDestination

 

指定目的地的 JNDI 名称或供应商名称。

replyDestination

 

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

destinationResolver

DynamicDestinationResolver

指定对 Spring DestinationResolver 的引用。

此属性允许您定义目标名称如何解析到 JMS 目的地。有效值为:

  • DynamicDestinationResolver sHistoryLimit->_<resolve 目标名称使用 JMS 提供程序的功能。
  • JndiDestinationResolver >_<-resolve 目标名称使用 JNDI。

transactionManager

 

指定对 Spring 事务管理器的引用。这可让服务参与 JTA 事务。

taskExecutor

SimpleAsyncTaskExecutor

CXF 3.0 中删除

前 CXF 3.0 指定对 Spring TaskExecutor 的引用。这在监听程序中用来决定如何处理传入的信息。

useJms11

false

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

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

  • true abrt- theJMS 1.1 功能
  • false abrt- theJMS 1.0.2 功能

messageIdEnabled

true

CXF 3.0 中删除

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

  • true KUBECONFIG-broker 需要提供消息 ID
  • false InventoryService-brokerbroker 不需要提供消息 ID

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

messageTimestampEnabled

true

CXF 3.0 中删除

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

  • true abrt- thebroker 需要提供消息时间戳
  • false InventoryService- thebroker 不需要提供消息时间戳

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

cacheLevel

-1( 禁用功能)

CXF 3.0 中删除

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

  • 0 — CACHE_NONE
  • 1 INVENTORYSERVICE-JAXBCACHE_CONNECTION
  • 2 — CACHE_SESSION
  • 3 — CACHE_CONSUMER
  • 4 — CACHE_AUTO

详情请参阅 Class DefaultMessageListenerContainer

pubSubNoLocal

false

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

  • true NETWORK- thedo 没有接收您自己的信息
  • false WWPN-receive 询问您自己的信息

receiveTimeout

60000

指定时间(以毫秒为单位),以等待响应消息。

explicitQosEnabled

false

指定每个消息是否明确设置 QoS 设置(如优先级、持久性、时间为实时),或使用默认值(false)。

deliveryMode

2

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

  • 1 (NON_955ISTENT)-messages 只保存内存
  • 2 (EFIISTENT)消息被保留到磁盘

priority

4

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

timeToLive

0( 无限)

指定丢弃的消息前的时间(以毫秒为单位)。

sessionTransacted

false

指定是否使用了 JMS 事务。

concurrentConsumers

1

CXF 3.0 中删除

前 CXF 3.0 指定侦听器的最小并发用户数。

maxConcurrentConsumers

1

CXF 3.0 中删除

前 CXF 3.0 为监听器指定最大并发用户数。

messageSelector

 

指定用于过滤传入消息的选择器的字符串值。此属性允许多个连接共享队列。有关使用指定选择器的语法的更多信息,请参阅 JMS 1.1 规格

subscriptionDurable

false

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

durableSubscriptionName

 

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

messageType

text

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

  • 文本 abrt->_< 表明数据将被打包为 text Message
  • byte Equal-jaxbspec 表示数据将被打包为字节数组(byte[])
  • 二进制 sHistoryLimit->_<spec 表示数据将被打包为 ByteMessage

pubSubDomain

false

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

  • true abrt- thetopic
  • false InventoryService- thequeue

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 指定当重启 JMSListenerContainer 时,会超过 maxSuspendedContinuations

当其当前暂停持续数低于 (maxSuspendedContinuations * reconnectPercentOfMax/100) 的值时,监听程序容器会被重启。

例 14.2 “JMS 配置 bean” 所示,an 的属性被指定为 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. 为该功能添加类型 org.apache.cxf.transport.jms.JMSConfigFeature 的 bean。
  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 配置添加到 JMS conduit” 显示使用来自 例 14.2 “JMS 配置 bean” 的 JMS 配置的 JMS conduit。

例 14.4. 将 JMS 配置添加到 JMS conduit

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