143 lines
9.4 KiB
XML
143 lines
9.4 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="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>ActiveMQ内建支持Stomp功能。要使用Stomp发送与接收消息,必须配置一个<literal>NettyAcceptor</literal>,
|
||
其中的<literal>protocol</literal>参数值应设为<literal>stomp</literal>:</para>
|
||
<programlisting>
|
||
<acceptor name="stomp-acceptor">
|
||
<factory-class>org.apache.activemq.core.remoting.impl.netty.NettyAcceptorFactory</factory-class> <param key="protocol" value="stomp"/>
|
||
<param key="port" value="61613"/>
|
||
</acceptor>
|
||
</programlisting>
|
||
<para>有了上述的配置,ActiveMQ就可以在端口<literal>61613</literal>(这是Stomp代理的默认端口)接受Stomp连接了。</para>
|
||
<para><literal>stomp</literal>例子展示了如何在ActiveMQ中配置Stomp。</para>
|
||
<section>
|
||
<title>限制</title>
|
||
<para>消息的通知不是事务性的。ACK信号不能作为事务的一部分来传输(如果设置了<literal>transaction</literal>
|
||
属性,它将被忽略)。</para>
|
||
</section>
|
||
</section>
|
||
<section>
|
||
<title>Stomp目标与ActiveMQ的地址和队列的映射</title>
|
||
<para>Stomp客户端在消息发送和订阅中使用的是<emphasis>目标(destination)</emphasis>。目标名称是简单的字符串,对应的是服务
|
||
器端的目的地。不同服务器对这种映射有着不同的实现。</para>
|
||
<para>在ActiveMQ中这些目标被映射为<emphasis>地址</emphasis>和<emphasis>队列</emphasis>。
|
||
当一个Stomp客户端发送一个消息(使用<literal>SEND</literal>信号)到一个目标时,这个目标被映射到一个地址。
|
||
如果一个Stomp客户端订阅(或解除订阅)一个目标时(使用<literal>SUBSCRIBE</literal>或
|
||
<literal>UNSUBSCRIBE</literal>),这个目标被映射到一个ActiveMQ的队列。</para>
|
||
</section>
|
||
<section>
|
||
<title>Stomp与JMS的互操作性</title>
|
||
<section>
|
||
<title>使用JMS目标</title>
|
||
<para>正如<xref linkend="jms-core-mapping" />解释的那样,JMS的目标同样映射到ActiveMQ的地址与队列。如果你使用
|
||
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>ActiveMQ还支持通过<ulink url="http://dev.w3.org/html5/websockets/">Web Sockets</ulink>使用Stomp。任何支持
|
||
Web Socket的浏览器中可以利用ActiveMQ来发送和接收Stomp消息。</para>
|
||
<para>要使用些功能,必须配置一个<literal>NettyAcceptor</literal>,并设置<literal>protocol</literal>
|
||
的值为<literal>stomp_ws</literal>:</para>
|
||
<programlisting>
|
||
<acceptor name="stomp-ws-acceptor">
|
||
<factory-class>org.apache.activemq.core.remoting.impl.netty.NettyAcceptorFactory</factory-class>
|
||
<param key="protocol" value="stomp_ws"/>
|
||
<param key="port" value="61614"/>
|
||
</acceptor>
|
||
</programlisting>
|
||
<para>使用上面配置,ActiveMQ在URL路径<literal>/stomp</literal>下端口<literal>61614</literal>接收Stomp连接。
|
||
浏览器然后就可以连接到<literal>ws://<server>: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>例子给出一如何配置ActiveMQ服务器以使浏览器和Java应用程序通过一个JMS话题
|
||
进行消息的传递。</para>
|
||
</section>
|
||
<section id="stompconnect">
|
||
<title>StompConnect</title>
|
||
<para><ulink url="http://stomp.codehaus.org/StompConnect">StompConnect</ulink>是一个Stomp代理服务器,
|
||
它可以将Stomp协议转换为标准的JMS接口调用。因此,通过StompConnect的作用ActiveMQ可以作为一个Stomp代理,
|
||
与任何一个Stomp客户端通迅。这些客户端可以由C、C++、C#及.net等语言实现。</para>
|
||
<para>要运行StompConnect首先要启动ActiveMQ服务以及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包以及ActiveMQ的jar文件都在classpath中。最后,运行
|
||
<literal>java org.codehaus.stomp.jms.Main</literal>。</para>
|
||
</section>
|
||
</section>
|
||
<section>
|
||
<title>REST</title>
|
||
<para>ActiveMQ即将支持REST!</para>
|
||
</section>
|
||
<section>
|
||
<title>AMQP</title>
|
||
<para>ActiveMQ即将支持AMQP!</para>
|
||
</section>
|
||
</chapter>
|