activemq-artemis/docs/user-manual/zh/queue-attributes.xml

121 lines
9.2 KiB
XML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<?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 AttributionShare 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>&lt;queue name="selectorQueue">
&lt;entry name="/queue/selectorQueue"/>
&lt;selector string="color='red'"/>
&lt;durable>true&lt;/durable>
&lt;/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>&lt;queues>
&lt;queue name="jms.queue.selectorQueue">
&lt;address>jms.queue.selectorQueue&lt;/address>
&lt;filter string="color='red'"/>
&lt;durable>true&lt;/durable>
&lt;/queue>
&lt;/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>&lt;address-settings>
&lt;address-setting match="jms.queue.exampleQueue">
&lt;dead-letter-address>jms.queue.deadLetterQueue&lt;/dead-letter-address>
&lt;max-delivery-attempts>3&lt;/max-delivery-attempts>
&lt;redelivery-delay>5000&lt;/redelivery-delay>
&lt;expiry-address>jms.queue.expiryQueue&lt;/expiry-address>
&lt;last-value-queue>true&lt;/last-value-queue>
&lt;max-size-bytes>100000&lt;/max-size-bytes>
&lt;page-size-bytes>20000&lt;/page-size-bytes>
&lt;redistribution-delay>0&lt;/redistribution-delay>
&lt;send-to-dla-on-no-route>true&lt;/send-to-dla-on-no-route>
&lt;address-full-policy>PAGE&lt;/address-full-policy>
&lt;/address-setting>
&lt;/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>