特定のエンティティの変更に関心のあるすべてのクライアントに状態を同期したいと思います。だから私は次のようなものを達成したいと思います:
- エンティティで 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からコントローラーを呼び出す(つまり、、、)AfterCreateEventAfterSaveEventAfterLinkSaveEventAfterDeleteEvent
私が行く必要があるので、それでも解決策は私にはかなりうんざりしているようです:
- クライアント 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私の実装。
すべてのエンティティのすべてのメソッドを( *WebSocketControllersを介して) 手動で公開する必要があるように感じます。CUDそして、私はそれには怠惰すぎるかもしれません。
アイデア?