26.7 JMS 命名空间的支持
Spring 引入了 XML 命名空间以简化 JMS 的配置。使用 JMS 命名空间元素时,需要引用如下的 JMS Schema:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:jms="http://www.springframework.org/schema/jms"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/jms http://www.springframework.org/schema/jms/spring-jms.xsd">
    <!-- bean definitions here -->
</beans>
命名空间由三个顶级元素组成:
<jms:listener-container>
    <jms:listener destination="queue.orders" ref="orderService" method="placeOrder"/>
    <jms:listener destination="queue.confirmations" ref="confirmationLogger" method="log"/>
</jms:listener-container>
上面的例子等同于在第26.4.4节“MessageListenerAdapter”的示例,定义两个不同的监听器容器和两个不同的MessageListenerAdapter。除了上面显示的属性之外,listener元素也包含几个可选属性。下面的表格列出了所有的属性:
表26.1 JMS \的元素属性 
| 属性 | 描述 | 
|---|---|
| id | 托管监听容器的 bean 名称。如果未指定,将自动生成一个 bean 名称。 | 
| destination(必选) | 监听器的目的地名称,由 DestinationResolver的策略决定。 | 
| ref(必选) | 处理对象的 bean 名称。 | 
| method | 处理器中被调用的方法名。如果 ref 指向 MessageListener或者 SpringSessionAwareMessageListener,则这个属性可以被忽略。 | 
| response-destination | 默认的响应目的地是发送响应消息抵达的目的地。 这用于请求消息没有包含 JMSReplyTo域的情况。响应目的地类型被监听容器的destination-type属性决定。记住:这仅仅适用于有返回值的监听器方法,因为每个结果对象都会被转化成响应消息。 | 
| subscription | 持久订阅的名称(如果需要的话)。 | 
| selector | 监听器的一个可选的消息选择器。 | 
| concurrency | 监听器启动的会话/消费者的并发数量。可以是表示最大数量(例如“5”)的简单数字,也可以是表示下限以及上限(例如“3-5”)的范围。 请注意,指定的最小值只是一个提示,在运行时可能会被忽略。默认值是容器提供的值。 | 
\taskExecutor和destinationResolver)以及基本的 JMS 设置和资源引用。使用这些属性,可以定义很广泛的定制监听容器,同时仍享有命名空间的便利。
作为一个通过factory-id属性指定要暴露的 bean 的 id 的JmsListenerContainerFactory,自动暴露了这些设置。
jms:listener-container connection-factory="myConnectionFactory"
        task-executor="myTaskExecutor"
        destination-resolver="myDestinationResolver"
        transaction-manager="myTransactionManager"
        concurrency="10">
    <jms:listener destination="queue.orders" ref="orderService" method="placeOrder"/>
    <jms:listener destination="queue.confirmations" ref="confirmationLogger" method="log"/>
</jms:listener-container>
下面的表格描述了所有可用的属性。参考AbstractMessageListenerContainer类和具体子类的 Javadoc 来了解每个属性的细节。这部分的 Javadoc 也提高那个了事务选择和消息传输场景的讨论。
表26.2 JMS \的元素属性 
| 属性 | 描述 | 
|---|---|
| container-type | 监听容器的类型。 可用的选项有:default,simple,default102或simple102(默认值为“default”)。 | 
| container-class | 自定义监听容器的实现类作为完全限定类名。默认是 Spring 的标准 DefaultMessageListenerContainer或SimpleMessageListenerContainer,取决于container-type属性。 | 
| factory-id | 通过对 JmsListenerContainerFactory指定 id,暴露该元素的设置,以便它们可以与其他端点一起使用。 | 
| connection-factory | 对 JMS ConnectionFactorybean 的引用(默认 bean 名称为connectionFactory)。 | 
| task-executor | 对JMS监听器调用者的 Spring TaskExecutor的引用。 | 
| destination-resolver | 对解决 JMS 目标的 DestinationResolver策略的引用。 | 
| message-converter | 对 JMS 消息转换为监听器方法参数的 MessageConverter策略的引用。 默认是一个SimpleMessageConverter。 | 
| error-handler | 对处理任何未捕获异常的 ErrorHandler策略的引用,异常可能发生在MessageListener的执行期间。 | 
| destination-type | 监听器的 JMS 目标类型:queue,topic,durableTopic,sharedTopic 或 sharedDurableTopic。 这样可以间接启用容器的 pubSubDomain,subscriptionDurable和subscriptionShared属性。 默认是队列(即禁用这3个属性)。 | 
| response-destination-type | 响应的JMS目标类型:queue、topic。 默认值为 destination-type属性的值。 | 
| client-id | 监听容器的 JMS 客户 ID。 使用持久订阅时需要指定。 | 
| cache | JMS资源的缓存级别:none, connection, session, consumer 或者 auto。 默认情况下(auto),缓存级别有效的是“consumer”。除非已经指定了外部事务管理器,在这种情况下,有效的默认值为 none(假设 Java EE 风格的事务管理,其中给定的 ConnectionFactory是 XA-aware 池)。 | 
| acknowledge | 原生JMS确认模式:auto,client,dups-ok 或 transacted。transacted 值激活了本地交易的会话。 或者,指定下面描述的 transaction-manager属性。默认为 auto。 | 
| transaction-manager | 对外部 PlatformTransactionManager的引用(通常是基于XA的事务协调器,例如 Spring 的JtaTransactionManager)。如果未指定,将使用本地确认(请参阅acknowledge属性)。 | 
| concurrency | 每个监听器启动的会话/消费者的并发数量。 可以是表示最大数量(例如“5”)的简单数字,也可以是表示下限以及上限(例如“3-5”)的范围。 请注意,指定的最小值只是一个提示,在运行时可能会被忽略。 默认值为1;在 topic 监听器或者 queue 的次序很重要的情况下,将并发限制为1;一般的queue可以考虑提高并发数。 | 
| prefetch | 要加载到单个会话的消息的最大数量。请注意,提高此数量可能会导致并发消费者的饥饿! | 
| receive-timeout | 用于接收调用的超时时间(以毫秒为单位)。 默认值为1000 ms(1秒);-1表示没有超时限制。 | 
| back-off | 指定用于计算恢复尝试间隔的 BackOff实例。 如果BackOffExecution实现返回BackOffExecution#STOP,监听容器将不再进一步尝试恢复。 当设置此属性时,将忽略recovery-interval值。 默认值为FixedBackOff,间隔为5000 ms,即5秒。 | 
| recovery-interval | 指定恢复尝试之间的间隔(以毫秒为单位)。是以指定间隔创建 FixedBackOff的便捷方式。 有关更多恢复选项,请考虑指定BackOff实例。 默认值为5000 ms,即5秒。 | 
| phase | 此容器应在其中开始和停止的生命周期阶段。 值越小,容器就越早启动,并且更晚停止。 默认值为 Integer。MAX_VALUE,意味着容器将尽可能晚地启动并尽快停止。 | 
使用 jms Schema 支持来配置基于 JCA 的监听器容器很相似。
<jms:jca-listener-container resource-adapter="myResourceAdapter"
        destination-resolver="myDestinationResolver"
        transaction-manager="myTransactionManager"
        concurrency="10">
    <jms:listener destination="queue.orders" ref="myMessageListener"/>
</jms:jca-listener-container>
JCA 可用的配置选项描述如下表:
表26.3 JMS \的元素属性 
| 属性 | 描述 | |
|---|---|---|
| factory-id | 通过对 JmsListenerContainerFactory指定 id,暴露该元素的设置,以便它们可以与其他端点一起使用。 | |
| resource-adapter | 对 JCA ResourceAdapterbean 的引用(默认 bean 名称是resourceAdapter)。 | |
| activation-spec-factory | 对 JmsActivationSpecFactory的引用。 默认情况是自动检测 JMS 供应商及其ActivationSpec类(请参阅DefaultJmsActivationSpecFactory) | |
| destination-resolver | 对解决JMS目标的 DestinationResolver策略的引用。 | |
| message-converter | 对 JMS 消息转换为监听器方法参数的 MessageConverter策略的引用。 默认是一个SimpleMessageConverter。 | |
| error-handler | 对处理任何未捕获异常的 ErrorHandler策略的引用,异常可能发生在MessageListener的执行期间。 | |
| destination-type | 监听器的JMS目标类型:queue,topic,durableTopic,sharedTopic或sharedDurableTopic。 这样可以间接启用容器的pubSubDomain,subscriptionDurable和subscriptionShared属性。 默认是队列(即禁用这3个属性)。 | |
| response-destination-type | 响应的JMS目标类型:“queue”,“topic”。 默认值为“destination-type”属性的值。 | |
| client-id | 监听容器的 JMS 客户 ID。 使用持久订阅时需要指定。 | |
| acknowledge | 原生JMS确认模式:auto,client,dups-ok 或 transacted。transacted 值激活了本地交易的会话。 或者,指定下面描述的 transaction-manager属性。 默认为 auto。 | |
| transaction-manager | 对 Spring JtaTransactionManager或javax.transaction.TransactionManager的引用,为每个传入消息启动 XA 事务。 如果未指定,将使用本地确认(请参阅acknowledge属性)。 | |
| concurrency | 每个监听器启动的会话/消费者的并发数量。 可以是表示最大数量(例如“5”)的简单数字,也可以是表示下限以及上限(例如“3-5”)的范围。 请注意,指定的最小值只是一个提示,在使用 JCA 监听容器的运行时可能会被忽略。 默认值为1; | |
| prefetch | 要加载到单个会话的消息的最大数量。 请注意,提高此数量可能会导致并发消费者的饥饿! |