121 lines
9.2 KiB
XML
121 lines
9.2 KiB
XML
<?xml version="1.0" encoding="UTF-8"?>
|
||
<!-- ============================================================================= -->
|
||
<!-- Copyright © 2009 Red Hat, Inc. and others. -->
|
||
<!-- -->
|
||
<!-- The text of and illustrations in this document are licensed by Red Hat under -->
|
||
<!-- a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). -->
|
||
<!-- -->
|
||
<!-- An explanation of CC-BY-SA is available at -->
|
||
<!-- -->
|
||
<!-- http://creativecommons.org/licenses/by-sa/3.0/. -->
|
||
<!-- -->
|
||
<!-- In accordance with CC-BY-SA, if you distribute this document or an adaptation -->
|
||
<!-- of it, you must provide the URL for the original version. -->
|
||
<!-- -->
|
||
<!-- Red Hat, as the licensor of this document, waives the right to enforce, -->
|
||
<!-- and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent -->
|
||
<!-- permitted by applicable law. -->
|
||
<!-- ============================================================================= -->
|
||
<chapter id="queue-attributes">
|
||
<title>队列属性</title>
|
||
<para>有两种方法可以设置队列的属性。一种使用配置文件,另一种使用核心接口(core API)。
|
||
本章讲述这些属性的配置以及这些属性的作用。</para>
|
||
<section id="predefined.queues">
|
||
<title>预定义的队列</title>
|
||
<para>通过配置可以定义队列。队列的定义可以在核心层定义,也可以在JMS层来定义。首先我们看一下JMS层。</para>
|
||
<para>下面就是一个在<literal>hornetq-jms.xml</literal>中定义的一个队列的例子:</para>
|
||
<programlisting><queue name="selectorQueue">
|
||
<entry name="/queue/selectorQueue"/>
|
||
<selector string="color='red'"/>
|
||
<durable>true</durable>
|
||
</queue></programlisting>
|
||
<para>这个队列的name属性定义了队列的名字。例子中我们采用了一种命名的惯例,因些对应的核心队列的名字是
|
||
<literal>jms.queue.selectorQueue</literal>。</para>
|
||
<para>在entry单元内定义的名字用来将队列绑定于JNDI。这是必不可少的。一个队列可以有多个entry定义,每个
|
||
定义中的名字都绑定到同一个队列。</para>
|
||
<para>selector单元定义的是队列的选择器。定义了选择器后,只有与选择器相匹配的消息才能被加到队列中。
|
||
这是一个可选项。如果没有定义选择器,队列将默认没有选择器。</para>
|
||
<para>durable定义了队列是否是一个可持久的队列。这也是一个可选项,默认值是true。</para>
|
||
<para>如果在核心层定义队列,则使用<literal>hornetq-configuration.xml</literal>文件。
|
||
下面是一个例子:</para>
|
||
<programlisting><queues>
|
||
<queue name="jms.queue.selectorQueue">
|
||
<address>jms.queue.selectorQueue</address>
|
||
<filter string="color='red'"/>
|
||
<durable>true</durable>
|
||
</queue>
|
||
</queues></programlisting>
|
||
<para>它的配置与JMS的配置很相似,但有三个不同之处:</para>
|
||
<orderedlist>
|
||
<listitem>
|
||
<para>队列的name属性是队列的真正名字,不是JMS中的名字。</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>address一项定义了消息路由的地址。</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>没有entry单元。</para>
|
||
</listitem>
|
||
<listitem>
|
||
<para>filter的定义使用<emphasis>核心过滤器语法</emphasis> (在
|
||
<xref linkend="filter-expressions"/>中描述),不是JMS的选择器语法。</para>
|
||
</listitem>
|
||
</orderedlist>
|
||
</section>
|
||
<section>
|
||
<title>使用接口(API)创建队列</title>
|
||
<para>队列还可以使用核心接口或管理接口来创建。</para>
|
||
<para>核心接口的<literal>org.hornetq.api.core.client.ClientSession</literal>接口可以用来
|
||
创建队列。它有几个<literal>createQueue</literal>方法,可以在创建队列时对上述的属性进行设置。
|
||
除此之外,还有一个额外的属性<literal>temporary</literal>可以设置。如果将其设为true,
|
||
那么队列在会话断开时将被删除。</para>
|
||
<para>在<xref linkend="management"/>中讲述了如何用管理接口来创建队列。</para>
|
||
</section>
|
||
<section id="queue-attributes.address-settings">
|
||
<title>通过地址设置来配置队列属性</title>
|
||
<para>有些属性的定义中地址可以使用通配符。下面是<literal>hornetq-configuration.xml</literal>
|
||
文件中的一个<literal>address-setting</literal>的配置例子。</para>
|
||
<programlisting><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></programlisting>
|
||
<para>通过上述的地址设定可以将多个属性应用于所有与<literal>match</literal>属性相匹配的地址。
|
||
上面例子中所定义的属性应用于<literal>jms.queue.exampleQueue</literal>的地址。如果使用
|
||
通配符,就可以将这些属性应用于一组匹配的地址。通配符的详细说明在<link linkend="wildcard-syntax">这里</link>。</para>
|
||
<para>例如在<literal>match</literal>中定义字符串<literal>jms.queue.#</literal>,那么
|
||
定义的属性就会应用于所有以<literal>jms.queue.</literal>开头的地址--即所有的JMS队列。</para>
|
||
<para>这些属性在本手册的各个地方有相应的介绍。在此处给出了简单的解释各它所在章的连接。</para>
|
||
<para><literal>max-delivery-attempts</literal>定义了最大重传递的次数。一个消息如果反复传递超过
|
||
了这个值将会被发往死信地址<literal>dead-letter-address</literal>。相关的完整的解释在
|
||
<link linkend="undelivered-messages.configuring">这里</link>。</para>
|
||
<para><literal>redelivery-delay</literal>定义了重新传递的延迟。它控制HornetQ在重新
|
||
传递一个被取消的消息时要等待的时间。参见<link linkend="undelivered-messages.delay"
|
||
>这里</link>。</para>
|
||
<para><literal>expiry-address</literal>定义了过期消息的发送地址。参见<link linkend="message-expiry.configuring">这里</link>。</para>
|
||
<para><literal>last-value-queue</literal> 定义一个队列是否使用最新值。参见<link linkend="last-value-queues">这里</link>。</para>
|
||
<para><literal>max-size-bytes</literal>和<literal>page-size-bytes</literal>用来设置地址的分页转存功能。
|
||
它们在<link linkend="paging">这里</link>有详细的解释。</para>
|
||
<para><literal>redistribution-delay</literal>定义了当最后一个接收者关闭时重新分配队列消息前所等待的时间。
|
||
参见<link linkend="clusters.message-redistribution">这里</link>。</para>
|
||
<para><literal>send-to-dla-on-no-route</literal>。当一个消息被送到某个地址时,可能不会被路由到任何一个队列。
|
||
例如该地址没有绑定任何队列的情况,或者它所有的队列的选择器与该消息不匹配时。这样的消息通常情况下会被丢弃。这时
|
||
如果将这个参数设为true,则如果这个地址配置了死信地址的话,这样的消息就会被发送到该地址的死信地址(DLA)。</para>
|
||
<para><literal>address-full-policy</literal>。这个属性有三个可能的值:PAGE、 DROP 或 BLOCK。它决定了
|
||
如果地址的消息所占用的内存达到了<literal>max-size-bytes</literal>所定义的值时,如何处理后继到来的消息。
|
||
默认值是PAGE,就是将后续的消息分页转存到磁盘上。DROP则表示丢弃后续的消息。BLOCK表示阻塞消息的发送方发送后续
|
||
的消息。参见<xref linkend="flow-control"/>和<xref linkend="paging"/>。
|
||
</para>
|
||
|
||
</section>
|
||
</chapter>
|