Я хотел бы синхронизировать состояние со всеми клиентами, заинтересованными в конкретных изменениях сущностей. Поэтому я хотел бы добиться чего-то вроде:
- отображение CRUD API на сущности (через
HTTP/REST
иwebsockets
) - и маршрутизацию ответа (измененных вызовов) на
websockets
topic
Так технически, меня бы интересовали идеи для смешивания 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) -
websocket
message → Springwebsocket
controller - spring websocket controller -
websocket
сообщение через тему → все клиенты, заинтересованные в теме - Сервер (spring -data-rest controller) -
HTTP
response → 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
для всех моих объектов. И я мог бы быть слишком ленив для этого.
Идеи?