web-dev-qa-db-ja.com

Spring Websocket + SockJSのSimpleMessageBrokerの/ topic、/ queueの違い

「シンプルブローカー」を使用している場合、Spring Websocket + SockJSの/ topic、/ queueなどの違いは何ですか?例えば。ここ Spring Websocketで特定のユーザーにメッセージを送信する それは言われています:クライアントが/ user /で始まるチャネルにサブスクライブするとき、例えば:/ user/queue/reply、サーバーインスタンスはqueue/reply-user [session id]という名前のキューにサブスクライブします

このような変換の背後にあるロジックを明確に理解したいと思います。

11
Askar Ibragimov

リファレンスドキュメントのこの部分 をご覧ください。簡単に言うと、"/topic""/queue"は、どちらも同じ宛先に設定されたプレフィックスです。

ドキュメントでは、"/app"は設定された「アプリケーション宛先プレフィックス」です。つまり、"clientInboundChannel"を介して流入し、それらのプレフィックスに一致するすべてのメッセージは、たとえば@MessageMappingアノテーションを使用してアプリケーションにマッピングされます。 。

ここでも、"/topic""/queue"は両方ともSTOMP宛先として設定されたプレフィックスです。つまり、"clientInboundChannel"を介して流入し、それらのプレフィックスに一致するすべてのメッセージがSTOMPブローカーに転送されます。あなたの場合、それは単純なブローカーの実装です。

したがって、Spring Websocketの観点からは、"/queue""/topic"は同じように扱われ、「典型的な」STOMP宛先です。これらに一致するすべてのメッセージはメッセージブローカーに転送されます。これで、完全なメッセージブローカーの実装を使用している場合、それらの宛先は同じ意味を持たず、メッセージブローカーの動作が異なる可能性があります。 Apache Apollo および RabbitMQ の例を次に示します。

必要に応じて、これらのプレフィックスを変更できることに注意してください。しかし、自分が何をしているのかを本当に理解していない限り、これらをデフォルトのままにしておくことをお勧めします。

14
Brian Clozel

そのトピックに対する最良の答えは、SpringDocsからの次のようなものだと思います

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

3
cleitonpqz