Chapter 25. 队列属性

有两种方法可以设置队列的属性。一种使用配置文件,另一种使用核心接口(core API)。 本章讲述这些属性的配置以及这些属性的作用。

25.1. 预定义的队列

通过配置可以定义队列。队列的定义可以在核心层定义,也可以在JMS层来定义。首先我们看一下JMS层。

下面就是一个在hornetq-jms.xml中定义的一个队列的例子:

<queue name="selectorQueue">
      <entry name="/queue/selectorQueue"/>
      <selector string="color='red'"/>
      <durable>true</durable>
</queue>

这个队列的name属性定义了队列的名字。例子中我们采用了一种命名的惯例,因些对应的核心队列的名字是 jms.queue.selectorQueue

在entry单元内定义的名字用来将队列绑定于JNDI。这是必不可少的。一个队列可以有多个entry定义,每个 定义中的名字都绑定到同一个队列。

selector单元定义的是队列的选择器。定义了选择器后,只有与选择器相匹配的消息才能被加到队列中。 这是一个可选项。如果没有定义选择器,队列将默认没有选择器。

durable定义了队列是否是一个可持久的队列。这也是一个可选项,默认值是true。

如果在核心层定义队列,则使用hornetq-configuration.xml文件。 下面是一个例子:

<queues>     
   	<queue name="jms.queue.selectorQueue">
   	    <address>jms.queue.selectorQueue</address>
   	    <filter string="color='red'"/>
       <durable>true</durable>
   	</queue>
</queues>

它的配置与JMS的配置很相似,但有三个不同之处:

  1. 队列的name属性是队列的真正名字,不是JMS中的名字。

  2. address一项定义了消息路由的地址。

  3. 没有entry单元。

  4. filter的定义使用核心过滤器语法 (在 Chapter 14, 过滤器表达式中描述),不是JMS的选择器语法。

25.2. 使用接口(API)创建队列

队列还可以使用核心接口或管理接口来创建。

核心接口的org.hornetq.api.core.client.ClientSession接口可以用来 创建队列。它有几个createQueue方法,可以在创建队列时对上述的属性进行设置。 除此之外,还有一个额外的属性temporary可以设置。如果将其设为true, 那么队列在会话断开时将被删除。

Chapter 30, 管理中讲述了如何用管理接口来创建队列。

25.3. 通过地址设置来配置队列属性

有些属性的定义中地址可以使用通配符。下面是hornetq-configuration.xml 文件中的一个address-setting的配置例子。

<address-settings>
    <address-setting match="jms.queue.exampleQueue">
        <dead-letter-address>jms.queue.deadLetterQueue</dead-letter-address>
        <max-delivery-attempts>3</max-delivery-attempts>
        <redelivery-delay>5000</redelivery-delay>
        <expiry-address>jms.queue.expiryQueue</expiry-address>
        <last-value-queue>true</last-value-queue>        
        <max-size-bytes>100000</max-size-bytes>
        <page-size-bytes>20000</page-size-bytes>
        <redistribution-delay>0</redistribution-delay>
        <send-to-dla-on-no-route>true</send-to-dla-on-no-route>
        <address-full-policy>PAGE</address-full-policy>
     </address-setting>
</address-settings>

通过上述的地址设定可以将多个属性应用于所有与match属性相匹配的地址。 上面例子中所定义的属性应用于jms.queue.exampleQueue的地址。如果使用 通配符,就可以将这些属性应用于一组匹配的地址。通配符的详细说明在这里

例如在match中定义字符串jms.queue.#,那么 定义的属性就会应用于所有以jms.queue.开头的地址--即所有的JMS队列。

这些属性在本手册的各个地方有相应的介绍。在此处给出了简单的解释各它所在章的连接。

max-delivery-attempts定义了最大重传递的次数。一个消息如果反复传递超过 了这个值将会被发往死信地址dead-letter-address。相关的完整的解释在 这里

redelivery-delay定义了重新传递的延迟。它控制HornetQ在重新 传递一个被取消的消息时要等待的时间。参见这里

expiry-address定义了过期消息的发送地址。参见这里

last-value-queue 定义一个队列是否使用最新值。参见这里

max-size-bytespage-size-bytes用来设置地址的分页转存功能。 它们在这里有详细的解释。

redistribution-delay定义了当最后一个接收者关闭时重新分配队列消息前所等待的时间。 参见这里

send-to-dla-on-no-route。当一个消息被送到某个地址时,可能不会被路由到任何一个队列。 例如该地址没有绑定任何队列的情况,或者它所有的队列的选择器与该消息不匹配时。这样的消息通常情况下会被丢弃。这时 如果将这个参数设为true,则如果这个地址配置了死信地址的话,这样的消息就会被发送到该地址的死信地址(DLA)。

address-full-policy。这个属性有三个可能的值:PAGE、 DROP 或 BLOCK。它决定了 如果地址的消息所占用的内存达到了max-size-bytes所定义的值时,如何处理后继到来的消息。 默认值是PAGE,就是将后续的消息分页转存到磁盘上。DROP则表示丢弃后续的消息。BLOCK表示阻塞消息的发送方发送后续 的消息。参见Chapter 19, 流控制Chapter 24, 分页转存