87 lines
6.7 KiB
XML
87 lines
6.7 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="diverts">
|
||
<title>消息的转发(divert)与分流</title>
|
||
<para>在HornetQ中可以配置一些称为转发器(<emphasis>diverts</emphasis>)的对象。</para>
|
||
<para>转发器可以将路由到一个地址的消息透明地转发到其它的地址去,不需要客户端的参与。</para>
|
||
<para>转发器可以是<emphasis>唯一(exclusive)</emphasis>的,即消息只转发到新的地址,不发到原
|
||
来的地址;也可以是<emphasis>不唯一(non-exclusive)</emphasis>的,即消息在发往原有地址的
|
||
同时,它的一个<emphasis>拷贝</emphasis>被发往新的地址。不唯一的转发器可以在应用中将消息进行
|
||
<emphasis>分流(splitting)</emphasis>。比如在一个订单系统中它可以用于监视发往订单队列中
|
||
的每个订单消息。</para>
|
||
<para>转发器还可以带一个可选的消息选择器。只有被选择器选择的消息才会被转发。</para>
|
||
<para>转发器还可以带有一个<literal>转换器(Transformer)</literal>。它可以将消息进行转换。</para>
|
||
<para>转发器只在同一个服务器中的地址间进行转发。如果要向另外服务器中的地址进行转发,可以采用转发器与桥配合
|
||
来实现。先将消息通过转发器转发到一个存储与转发的队列中,再由一个桥将这个队列的消息转发到远程服务器的目的
|
||
地址中。</para>
|
||
<para>由转发器与桥进行配合可以组成复杂的路由系统。在服务器中由一组转发器可以形成一个消息路由表。如果加上桥,就
|
||
可以进一步形成一个分布式的可靠的消息路由网。</para>
|
||
<para>转发器的配置在<literal>hornetq-configuration.xml</literal>中定义。可以配置零个或多个转发器。</para>
|
||
<para>参见转发器的例子<xref linkend="divert-example" />,它展示了如何配置与使用转发器。</para>
|
||
<para>让我们看一些转发器的配置例子:</para>
|
||
<section>
|
||
<title>唯一式转发器</title>
|
||
<para>下面是一个唯一式转发器的例子。它将所有符合条件的消息转发到新的地址,而旧的地址将不能得到这些消息。</para>
|
||
<para>以下配置来自于divert例子:</para>
|
||
<programlisting>
|
||
<divert name="prices-divert">
|
||
<address>jms.topic.priceUpdates</address>
|
||
<forwarding-address>jms.queue.priceForwarding</forwarding-address>
|
||
<filter string="office='New York'"/>
|
||
<transformer-class-name>
|
||
org.hornetq.jms.example.AddForwardingTimeTransformer
|
||
</transformer-class-name>
|
||
<exclusive>true</exclusive>
|
||
</divert>
|
||
</programlisting>
|
||
<para>在这里我们定义了一相名为“<literal>prices-divert</literal>”的转发器,它将发往
|
||
“<literal>jms.topic.priceUpdates</literal>”(对应JMS话题<literal
|
||
>priceUpdates</literal>)的消息转向另一个本地地址“<literal
|
||
>jms.queue.priceForwarding</literal>”(对应JMS队列
|
||
<literal>priceForwarding</literal>)。</para>
|
||
<para>我们还配置了一相消息过滤器。只有<literal>office</literal>属性值为<literal>New York</literal>
|
||
的消息才被转发到新地址,其它消息则继续发往原地址。如果没有定义过滤器,所有消息将被转发。</para>
|
||
<para>本例中还配置了一个转换器的类。当每转发一个消息时,该转换器就被执行一次。转换器可以对消息在转发前进行
|
||
更改。这里的转换器只是在消息中加入了一个记录转发时间的消息头。</para>
|
||
<para>本例中消息被转发到一个’存贮与转发是‘队列,然后通过一个桥将消息转发到另一个HornetQ服务器中。</para>
|
||
</section>
|
||
<section>
|
||
<title>不唯一转发器</title>
|
||
<para>下面我们来看一个不唯一的转发器。不唯一转发器将消息的<emphasis>拷贝</emphasis>转发到新的地址中,
|
||
原消息则继续发往原有地址。</para>
|
||
<para>因此不唯一转发器可以将消息进行分流(splitting)。</para>
|
||
<para>不唯一转发器的配置与唯一转发器的配置中一样的,也可以带一个可选的过滤器和转换器。下面的配置也是出自
|
||
divert例子:</para>
|
||
<programlisting>
|
||
<divert name="order-divert">
|
||
<address>jms.queue.orders</address>
|
||
<forwarding-address>jms.topic.spyTopic</forwarding-address>
|
||
<exclusive>false</exclusive>
|
||
</divert>
|
||
</programlisting>
|
||
<para>The above divert example takes a copy of every message sent to the address '<literal
|
||
>jms.queue.orders</literal>' (Which corresponds to a JMS Queue called '<literal
|
||
>orders</literal>') and sends it to a local address called '<literal
|
||
>jms.topic.SpyTopic</literal>' (which corresponds to a JMS Topic called '<literal
|
||
>SpyTopic</literal>').</para>
|
||
</section>
|
||
</chapter>
|