Я хотел бы синхронизировать состояние со всеми клиентами, заинтересованными в конкретных изменениях сущностей. Поэтому я хотел бы добиться чего-то вроде:
- отображение CRUD API на сущности (через
HTTP/RESTиwebsockets) - и маршрутизацию ответа (измененных вызовов) на
websocketstopic
Так технически, меня бы интересовали идеи для смешивания spring-data-rest с spring реализацией websockets для достижения чего-то вроде spring -data-websocket.
Есть два решения, которые приходят мне на ум, и на самом деле оба будут:
- 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
Технически, может быть достигнуто:
- вызов контроллеров
websocketиз событий spring -rest-data (а именно вAfterCreateEvent,AfterSaveEvent,AfterLinkSaveEvent,AfterDeleteEvent)
Тем не менее решение кажется мне очень больным, так как мне нужно будет:
- клиент A -
HTTPзапрос → сервер (spring -data-rest controller) - Сервер (AfterXXXEvent в контроллере spring -data-rest) -
websocketmessage → Springwebsocketcontroller - spring websocket controller -
websocketсообщение через тему → все клиенты, заинтересованные в теме - Сервер (spring -data-rest controller) -
HTTPresponse → client A
Сценарий 2: Websocket API не зависит от REST API
Правила:
- Клиентский запрос
REST/HTTP APIтолько для операций без модификации - ответ
REST/HTTP APIтолько для операций без модификации - клиент отправляет сообщение
websocketдля всех операций модификации -
websocketсообщение отправляется клиенту только для всех операций модификации
Ну, если другие идеи не появятся, я бы пошел на более поздний, но все же было бы здорово, если бы я мог каким-то образом генерировать методы C(R)UD, которые были открыты через websockets, что-то вроде spring -data-websockets и обрабатывать только маршруты в моей реализации.
Как мне кажется, мне пришлось бы вручную выставить (через *WebSocketController s) все методы CUD для всех моих объектов. И я мог бы быть слишком ленив для этого.
Идеи?