一、STOMP協議介紹
STOMP即Simple (or Streaming) Text Orientated Messaging Protocol,簡單(流)文本定向消息協議,它提供了一個可互操作的連接格式,允許STOMP客戶端與任意STOMP消息代理(Broker)進行交互。STOMP協議由於設計簡單,易於開發客戶端,因此在多種語言和多種平台上得到廣泛地應用。
STOMP協議的前身是TTMP協議(一個簡單的基於文本的協議),專為消息中間件設計。
STOMP是一個非常簡單和容易實現的協議,其設計靈感源自於HTTP的簡單性。盡管STOMP協議在服務器端的實現可能有一定的難度,但客戶端的實現卻很容易。例如,可以使用Telnet登錄到任何的STOMP代理,並與STOMP代理進行交互。
STOMP協議與2012年10月22日發布了最新的STOMP 1.2規范。
要查看STOMP 1.2規范,見: https://stomp.github.io/stomp-specification-1.2.html
二、STOMP的實現
業界已經有很多優秀的STOMP的服務器/客戶端的開源實現,下面就介紹一下這方面的情況。
1、STOMP服務器
項目名 | 兼容STOMP的版本 | 描述 |
Apache Apollo
1.0 1.1 1.2
ActiveMQ的繼承者 http://activemq.apache.org/apollo
Apache ActiveMQ
1.0 1.1
流行的開源消息服務器 http://activemq.apache.org/
HornetQ
1.0
來自JBoss的消息中間件 http://www.jboss.org/hornetq
RabbitMQ
1.0 1.1 1.2
基於Erlang、支持多種協議的消息Broker,通過插件支持STOMP協議http://www.rabbitmq.com/plugins.html#rabbitmq-stomp
Stampy
1.2
STOMP 1.2規范的一個Java實現 http://mrstampy.github.com/Stampy/
StompServer
1.0
一個輕量級的純Ruby實現的STOMP服務器 http://stompserver.rubyforge.org/
這裡只列了部分。
2、STOMP客戶端庫
項目名 | 兼容STOMP的版本 | 描述 |
activemessaging
1.0
Ruby客戶端庫 http://code.google.com/p/activemessaging/
onstomp
1.0 1.1
Ruby客戶端庫 https://rubygems.org/gems/onstomp
Apache CMS
1.0
C++客戶端庫 http://activemq.apache.org/cms/
Net::STOMP::Client
1.0 1.1 1.2
Perl客戶端庫 http://search.cpan.org/dist/Net-STOMP-Client/
Gozirra
1.0
Java客戶端庫 http://www.germane-software.com/software/Java/Gozirra/
libstomp
1.0
C客戶端庫,基於APR庫 http://stomp.codehaus.org/C
Stampy
1.2
Java客戶端庫 http://mrstampy.github.com/Stampy/
stomp.js
1.0 1.1
JavaScript客戶端庫 http://jmesnil.net/stomp-websocket/doc/
stompest
1.0 1.1 1.2
Python客戶端庫,全功能實現,包括同步和異步 https://github.com/nikipore/stompest
StompKit
1.2
Objective-C客戶端庫,事件驅動 https://github.com/mobile-web-messaging/StompKit/
stompngo
1.0 1.1 1.2
Go客戶端庫 https://github.com/gmallard/stompngo
stomp.py
1.0 1.1 1.2
Python客戶端庫 https://github.com/jasonrbriggs/stomp.py
tStomp
1.1
TCL客戶端庫 https://github.com/siemens/tstomp
這裡只列了部分。
三、STOMP協議分析
STOMP協議與HTTP協議很相似,它基於TCP協議,使用了以下命令:
CONNECT
SEND
SUBSCRIBE
UNSUBSCRIBE
BEGIN
COMMIT
ABORT
ACK
NACK
DISCONNECT
STOMP的客戶端和服務器之間的通信是通過“幀”(Frame)實現的,每個幀由多“行”(Line)組成。
第一行包含了命令,然後緊跟鍵值對形式的Header內容。
第二行必須是空行。
第三行開始就是Body內容,末尾都以空字符結尾。
STOMP的客戶端和服務器之間的通信是通過MESSAGE幀、RECEIPT幀或ERROR幀實現的,它們的格式相似。