Chapter 45. 互操作性

45.1. Stomp

Stomp是一个基于文本的协议。使用Stomp协议的 客户端可以与Stomp的代理(broker)进行通迅。

Stomp客户端支持多种语言和平台,因此 它有着很好的互操作性。

45.1.1. 内建Stomp支持

HornetQ内建支持Stomp功能。要使用Stomp发送与接收消息,必须配置一个NettyAcceptor, 其中的protocol参数值应设为stomp

	<acceptor name="stomp-acceptor">
		<factory-class>org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory</factory-class>		<param key="protocol"  value="stomp"/>
		<param key="port"  value="61613"/>
	</acceptor>

有了上述的配置,HornetQ就可以在端口61613(这是Stomp代理的默认端口)接受Stomp连接了。

stomp例子展示了如何在HornetQ中配置Stomp。

45.1.1.1. 限制

消息的通知不是事务性的。ACK信号不能作为事务的一部分来传输(如果设置了transaction 属性,它将被忽略)。

45.1.2. Stomp目标与HornetQ的地址和队列的映射

Stomp客户端在消息发送和订阅中使用的是目标(destination)。目标名称是简单的字符串,对应的是服务 器端的目的地。不同服务器对这种映射有着不同的实现。

在HornetQ中这些目标被映射为地址队列。 当一个Stomp客户端发送一个消息(使用SEND信号)到一个目标时,这个目标被映射到一个地址。 如果一个Stomp客户端订阅(或解除订阅)一个目标时(使用SUBSCRIBEUNSUBSCRIBE),这个目标被映射到一个HornetQ的队列。

45.1.3. Stomp与JMS的互操作性

45.1.3.1. 使用JMS目标

正如Chapter 9, JMS与内核API之间的映射关系解释的那样,JMS的目标同样映射到HornetQ的地址与队列。如果你使用 Stomp向JMS的目标发送消息,那么Stomp的目标必须要遵照相同的命名规则:

  • 如果向JMS队列发送数据或订阅它,则队列的名称前缀必须是jms.queue.

    例如,如果向名为orders的JMS队列发送消息,Stomp客户端必须发送以下信息:

    SEND
    destination:jms.queue.orders
    
    hello queue orders
    ^@
                    
  • 如果向JMS 话题(topic)发送或订阅消息,话题名称前缀必须是jms.topic.

    例如,如果订阅名为 stocks的JMS话题,Stomp客户端必须发送以下信息:

      SUBSCRIBE
      destination:jms.topic.stocks
      
      ^@
                    

45.1.3.2. 使用JMS或核心接口发送和接收Stomp消息

Stomp基本上是一个基于文本的协议。为了使用更简单,我们的Stomp实现通过检查content-length的值 来决定如何将一个Stomp消息映射成一个JMS消息或核心消息。

如果在Stomp消息中有content-length头,它将被映射为一个JMS的 TextMessage,或者是一个核心消息,其消息体的缓存是一个SimpleString。

如果Stomp消息中没有content-length,则它被映射为一个JMS的 BytesMessage,或者是一个核心消息,其消息体缓存中是一个字节数组byte[]。

从一个JMS消息或核心消息映射为Stomp消息时遵从同样的逻辑。一个Stomp客户端可以通过检查 content-length来决定消息体的类型(UTF-8字符串或字节)。

45.1.4. 通过Web Sockets使用Stomp

HornetQ还支持通过Web Sockets使用Stomp。任何支持 Web Socket的浏览器中可以利用HornetQ来发送和接收Stomp消息。

要使用些功能,必须配置一个NettyAcceptor,并设置protocol 的值为stomp_ws

<acceptor name="stomp-ws-acceptor">
	<factory-class>org.hornetq.core.remoting.impl.netty.NettyAcceptorFactory</factory-class>
	<param key="protocol" value="stomp_ws"/>
	<param key="port" value="61614"/>
</acceptor>
         

使用上面配置,HornetQ在URL路径/stomp下端口61614接收Stomp连接。 浏览器然后就可以连接到ws://<server>:61614/stomp,使用Web Socket来发送和接收 Stomp消息了。

为了简化客户端的开发,在GitHub 上提供了一个JavaScript库(参见文档)。

stomp-websockets例子给出一如何配置HornetQ服务器以使浏览器和Java应用程序通过一个JMS话题 进行消息的传递。

45.1.5. StompConnect

StompConnect是一个Stomp代理服务器, 它可以将Stomp协议转换为标准的JMS接口调用。因此,通过StompConnect的作用HornetQ可以作为一个Stomp代理, 与任何一个Stomp客户端通迅。这些客户端可以由C、C++、C#及.net等语言实现。

要运行StompConnect首先要启动HornetQ服务以及JNDI服务。

Stomp需要jndi.properties文件要在classpath中。该文件 应有如下类似的内容:

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

要确保该文件与StompConnect的jar包以及HornetQ的jar文件都在classpath中。最后,运行 java org.codehaus.stomp.jms.Main

45.2. REST

HornetQ即将支持REST!

45.3. AMQP

HornetQ即将支持AMQP!