概要

STOMP (英語) (Simple Text Oriented Messaging Protocol)はもともと、エンタープライズメッセージブローカーに接続するためのスクリプト言語(Ruby、Python、Perl など)用に作成されました。一般的に使用されるメッセージングパターンの最小限のサブセットに対処するように設計されています。STOMP は、TCP や WebSocket などの信頼性のある双方向ストリーミングネットワークプロトコルで使用できます。STOMP はテキスト指向のプロトコルですが、メッセージペイロードはテキストまたはバイナリのいずれかです。

STOMP は、フレームが HTTP でモデル化されているフレームベースのプロトコルです。次のリストは、STOMP フレームの構造を示しています。

COMMAND
header1:value1
header2:value2

Body^@

クライアントは、SEND または SUBSCRIBE コマンドを使用して、メッセージの内容と受信者を説明する destination ヘッダーとともに、メッセージを送信またはサブスクライブできます。これにより、単純なパブリッシュ / サブスクライブメカニズムが有効になり、ブローカーを介して他の接続済みクライアントにメッセージを送信したり、サーバーにメッセージを送信して作業の実行をリクエストしたりできます。

Spring の STOMP サポートを使用すると、Spring WebSocket アプリケーションはクライアントに対する STOMP ブローカーとして機能します。メッセージは、@Controller メッセージ処理メソッド、またはサブスクリプションを追跡し、サブスクライブしたユーザーにメッセージをブロードキャストする単純なメモリ内ブローカーにルーティングされます。また、メッセージの実際のブロードキャストのために、専用の STOMP ブローカー(RabbitMQ、ActiveMQ など)と連携するように Spring を構成することもできます。その場合、Spring はブローカーへの TCP 接続を維持し、ブローカーにメッセージを中継し、ブローカーからのメッセージを接続された WebSocket クライアントに渡します。Spring Web アプリケーションは、統一された HTTP ベースのセキュリティ、一般的な検証、メッセージ処理のための使い慣れたプログラミングモデルに依存できます。

次の例は、クライアントが株価を受信するようにサブスクライブしていることを示しています。サーバーは定期的に(たとえば、SimpMessagingTemplate を介してブローカーにメッセージを送信するスケジュールされたタスクを介して)送信します。

SUBSCRIBE
id:sub-1
destination:/topic/price.stock.*

^@

次の例は、取引リクエストを送信するクライアントを示しています。サーバーは、@MessageMapping メソッドを介して処理できます。

SEND
destination:/queue/trade
content-type:application/json
content-length:44

{"action":"BUY","ticker":"MMM","shares",44}^@

実行後、サーバーは取引確認メッセージと詳細をクライアントにブロードキャストできます。

宛先の意味は、STOMP 仕様では意図的に不透明のままになっています。任意の文字列を使用でき、サポートする宛先のセマンティクスと構文を定義するのは、完全に STOMP サーバー次第です。ただし、宛先がパスのような文字列であるのは非常に一般的です。/topic/.. はパブリッシュ / サブスクライブ(1 対多)を意味し、/queue/ はポイントツーポイント(1 対 1)メッセージ交換を意味します。

STOMP サーバーは、MESSAGE コマンドを使用して、すべてのサブスクライバーにメッセージをブロードキャストできます。次の例は、購読しているクライアントに株価を送信するサーバーを示しています。

MESSAGE
message-id:nxahklf6-1
subscription:sub-1
destination:/topic/price.stock.MMM

{"ticker":"MMM","price":129.45}^@

サーバーは非請求メッセージを送信できません。サーバーからのすべてのメッセージは、特定のクライアントサブスクリプションにレスポンスする必要があり、サーバーメッセージの subscription ヘッダーは、クライアントサブスクリプションの id ヘッダーと一致する必要があります。

前述の概要は、STOMP プロトコルの最も基本的な理解を提供することを目的としています。プロトコル仕様 (英語) を完全に確認することをお勧めします。