特定のエンティティの変更に関心のあるすべてのクライアントに状態を同期したいと思います。だから私は次のようなものを達成したいと思います:
- エンティティで CRUD API を公開する ( および を介し
HTTP/REST
てwebsockets
) - (変更呼び出しの)応答を
websockets
トピックにルーティングします
技術的には、 spring-data-restとspring websocket の実装を組み合わせて、spring-data-websocket のようなものを実現するアイデアに興味があります。
私の頭に浮かぶ2つの解決策があり、実際には両方とも次のようになります。
- spring-data-rest を介してエンティティを公開する
REST/HTTP API
websocket
コントローラ (エンティティの変更呼び出しに使用)
コントローラーは次のwebsocket
ようになります。
@Controller
public class EntityAWebSocketController {
@MessageMapping("/EntityA/update")
@SendTo("/topic/EntityA/update")
public EntityA update(EntityA entityA) throws Exception {
// persist,....
return entityA;
}
}
シナリオ 1:Websocket API
から呼び出されたREST/HTTP API
ルール:
- クライアントのリクエストは常に
REST/HTTP API
- 応答は
REST/HTTP API
すべての操作に対するものです - さらに、操作を変更すると、
websocket
メッセージも表示されます
技術的には、次の方法で実現できます。
- spring-rest-data イベント
websocket
からコントローラーを呼び出す(つまり、、、)AfterCreateEvent
AfterSaveEvent
AfterLinkSaveEvent
AfterDeleteEvent
私が行く必要があるので、それでも解決策は私にはかなりうんざりしているようです:
- クライアント A --
HTTP
リクエスト --> サーバー (spring-data-rest コントローラー) - サーバー (spring-data-rest コントローラーの AfterXXXEvent) --
websocket
メッセージ --> Springwebsocket
コントローラー - Spring websocket コントローラー --
websocket
トピック経由のメッセージ --> トピックに関心のあるすべてのクライアント - サーバー (spring-data-rest コントローラー) --
HTTP
応答 --> クライアント A
シナリオ 2:Websocket API
から独立REST API
ルール:
- クライアント要求は
REST/HTTP API
非変更操作専用です - 応答は
REST/HTTP API
非変更操作のみです - クライアント
websocket
はすべての変更操作に対してメッセージを送信します websocket
メッセージは、すべての変更操作に対してのみクライアントに送信されます
他にアイデアが思い浮かばない場合は、後者の方法を使用しますが、それでも、spring-data-websockets のようなものC(R)UD
を介して公開されるメソッドを何らかの方法で生成し、ルートのみを処理できれば素晴らしいと思います。websockets
私の実装。
すべてのエンティティのすべてのメソッドを( *WebSocketController
sを介して) 手動で公開する必要があるように感じます。CUD
そして、私はそれには怠惰すぎるかもしれません。
アイデア?