队列属性
有两种方法可以设置队列的属性。一种使用配置文件,另一种使用核心接口(core API)。
本章讲述这些属性的配置以及这些属性的作用。
预定义的队列
通过配置可以定义队列。队列的定义可以在核心层定义,也可以在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的配置很相似,但有三个不同之处:
队列的name属性是队列的真正名字,不是JMS中的名字。
address一项定义了消息路由的地址。
没有entry单元。
filter的定义使用核心过滤器语法 (在
中描述),不是JMS的选择器语法。
使用接口(API)创建队列
队列还可以使用核心接口或管理接口来创建。
核心接口的org.apache.activemq6.api.core.client.ClientSession接口可以用来
创建队列。它有几个createQueue方法,可以在创建队列时对上述的属性进行设置。
除此之外,还有一个额外的属性temporary可以设置。如果将其设为true,
那么队列在会话断开时将被删除。
在中讲述了如何用管理接口来创建队列。
通过地址设置来配置队列属性
有些属性的定义中地址可以使用通配符。下面是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-bytes和page-size-bytes用来设置地址的分页转存功能。
它们在这里有详细的解释。
redistribution-delay定义了当最后一个接收者关闭时重新分配队列消息前所等待的时间。
参见这里。
send-to-dla-on-no-route。当一个消息被送到某个地址时,可能不会被路由到任何一个队列。
例如该地址没有绑定任何队列的情况,或者它所有的队列的选择器与该消息不匹配时。这样的消息通常情况下会被丢弃。这时
如果将这个参数设为true,则如果这个地址配置了死信地址的话,这样的消息就会被发送到该地址的死信地址(DLA)。
address-full-policy。这个属性有三个可能的值:PAGE、 DROP 或 BLOCK。它决定了
如果地址的消息所占用的内存达到了max-size-bytes所定义的值时,如何处理后继到来的消息。
默认值是PAGE,就是将后续的消息分页转存到磁盘上。DROP则表示丢弃后续的消息。BLOCK表示阻塞消息的发送方发送后续
的消息。参见和。