activemq-artemis/docs/user-manual/zh/interoperability.xml

143 lines
9.4 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="interoperability">
<title>互操作性</title>
<section id="stomp">
<title>Stomp</title>
<para><ulink url="http://stomp.codehaus.org/">Stomp</ulink>是一个基于文本的协议。使用Stomp协议的
客户端可以与Stomp的代理broker进行通迅。</para>
<para><ulink url="http://stomp.codehaus.org/Clients">Stomp客户端</ulink>支持多种语言和平台,因此
它有着很好的互操作性。</para>
<section id="stomp.native">
<title>内建Stomp支持</title>
<para>HornetQ内建支持Stomp功能。要使用Stomp发送与接收消息必须配置一个<literal>NettyAcceptor</literal>
其中的<literal>protocol</literal>参数值应设为<literal>stomp</literal></para>
<programlisting>
&lt;acceptor name="stomp-acceptor">
&lt;factory-class>org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory&lt;/factory-class> &lt;param key="protocol" value="stomp"/>
&lt;param key="port" value="61613"/>
&lt;/acceptor>
</programlisting>
<para>有了上述的配置HornetQ就可以在端口<literal>61613</literal>这是Stomp代理的默认端口接受Stomp连接了。</para>
<para><literal>stomp</literal>例子展示了如何在HornetQ中配置Stomp。</para>
<section>
<title>限制</title>
<para>消息的通知不是事务性的。ACK信号不能作为事务的一部分来传输如果设置了<literal>transaction</literal>
属性,它将被忽略)。</para>
</section>
</section>
<section>
<title>Stomp目标与HornetQ的地址和队列的映射</title>
<para>Stomp客户端在消息发送和订阅中使用的是<emphasis>目标destination</emphasis>。目标名称是简单的字符串,对应的是服务
器端的目的地。不同服务器对这种映射有着不同的实现。</para>
<para>在HornetQ中这些目标被映射为<emphasis>地址</emphasis><emphasis>队列</emphasis>
当一个Stomp客户端发送一个消息使用<literal>SEND</literal>信号)到一个目标时,这个目标被映射到一个地址。
如果一个Stomp客户端订阅或解除订阅一个目标时使用<literal>SUBSCRIBE</literal>
<literal>UNSUBSCRIBE</literal>这个目标被映射到一个HornetQ的队列。</para>
</section>
<section>
<title>Stomp与JMS的互操作性</title>
<section>
<title>使用JMS目标</title>
<para>正如<xref linkend="jms-core-mapping" />解释的那样JMS的目标同样映射到HornetQ的地址与队列。如果你使用
Stomp向JMS的目标发送消息那么Stomp的目标必须要遵照相同的命名规则</para>
<itemizedlist>
<listitem>
<para>如果向JMS<emphasis>队列</emphasis>发送数据或订阅它,则队列的名称前缀必须是<literal>jms.queue.</literal></para>
<para>例如,如果向名为<literal>orders</literal>的JMS队列发送消息Stomp客户端必须发送以下信息</para>
<programlisting>
SEND
destination:jms.queue.orders
hello queue orders
^@
</programlisting>
</listitem>
<listitem>
<para>如果向JMS <emphasis>话题topic</emphasis>发送或订阅消息,话题名称前缀必须是<literal>jms.topic.</literal></para>
<para>例如,如果订阅名为 <literal>stocks</literal>的JMS话题Stomp客户端必须发送以下信息</para>
<programlisting>
SUBSCRIBE
destination:jms.topic.stocks
^@
</programlisting>
</listitem>
</itemizedlist>
</section>
<section>
<title>使用JMS或核心接口发送和接收Stomp消息</title>
<para>Stomp基本上是一个基于文本的协议。为了使用更简单我们的Stomp实现通过检查<literal>content-length</literal>的值
来决定如何将一个Stomp消息映射成一个JMS消息或核心消息。
</para>
<para>如果在Stomp消息中<emphasis>没有</emphasis><literal>content-length</literal>它将被映射为一个JMS的
<emphasis>TextMessage</emphasis>或者是一个核心消息其消息体的缓存是一个SimpleString。</para>
<para>如果Stomp消息中<emphasis></emphasis><literal>content-length</literal>则它被映射为一个JMS的
<emphasis>BytesMessage</emphasis>或者是一个核心消息其消息体缓存中是一个字节数组byte[]。</para>
<para>从一个JMS消息或核心消息映射为Stomp消息时遵从同样的逻辑。一个Stomp客户端可以通过检查
<literal>content-length</literal>来决定消息体的类型(字符串或字节)。</para>
</section>
</section>
<section id="stomp.websockets">
<title>通过Web Sockets使用Stomp</title>
<para>HornetQ还支持通过<ulink url="http://dev.w3.org/html5/websockets/">Web Sockets</ulink>使用Stomp。任何支持
Web Socket的浏览器中可以利用HornetQ来发送和接收Stomp消息。</para>
<para>要使用些功能,必须配置一个<literal>NettyAcceptor</literal>,并设置<literal>protocol</literal>
的值为<literal>stomp_ws</literal></para>
<programlisting>
&lt;acceptor name="stomp-ws-acceptor">
&lt;factory-class>org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory&lt;/factory-class>
&lt;param key="protocol" value="stomp_ws"/>
&lt;param key="port" value="61614"/>
&lt;/acceptor>
</programlisting>
<para>使用上面配置HornetQ在URL路径<literal>/stomp</literal>下端口<literal>61614</literal>接收Stomp连接。
浏览器然后就可以连接到<literal>ws://&lt;server&gt;:61614/stomp</literal>使用Web Socket来发送和接收
Stomp消息了。</para>
<para>为了简化客户端的开发,在<ulink url="http://github.com/jmesnil/stomp-websocket">GitHub</ulink>
上提供了一个JavaScript库参见<ulink url="http://jmesnil.net/stomp-websocket/doc/">文档</ulink>)。</para>
<para><literal>stomp-websockets</literal>例子给出一如何配置HornetQ服务器以使浏览器和Java应用程序通过一个JMS话题
进行消息的传递。</para>
</section>
<section id="stompconnect">
<title>StompConnect</title>
<para><ulink url="http://stomp.codehaus.org/StompConnect">StompConnect</ulink>是一个Stomp代理服务器
它可以将Stomp协议转换为标准的JMS接口调用。因此通过StompConnect的作用HornetQ可以作为一个Stomp代理
与任何一个Stomp客户端通迅。这些客户端可以由C、C++、C#及.net等语言实现。</para>
<para>要运行StompConnect首先要启动HornetQ服务以及JNDI服务。</para>
<para>Stomp需要<literal>jndi.properties</literal>文件要在classpath中。该文件
应有如下类似的内容:</para>
<programlisting>java.naming.factory.initial=org.jnp.interfaces.NamingContextFactory
java.naming.provider.url=jnp://localhost:1099
java.naming.factory.url.pkgs=org.jboss.naming:org.jnp.interfaces</programlisting>
<para>要确保该文件与StompConnect的jar包以及HornetQ的jar文件都在classpath中。最后运行
<literal>java org.codehaus.stomp.jms.Main</literal></para>
</section>
</section>
<section>
<title>REST</title>
<para>HornetQ即将支持REST</para>
</section>
<section>
<title>AMQP</title>
<para>HornetQ即将支持AMQP</para>
</section>
</chapter>