队列属性 有两种方法可以设置队列的属性。一种使用配置文件,另一种使用核心接口(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-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表示阻塞消息的发送方发送后续 的消息。参见