Как смешивать spring -data-rest с spring websocket в одну реализацию
Я хотел бы синхронизировать состояние со всеми клиентами, заинтересованными в конкретных изменениях сущностей. Поэтому я хотел бы добиться чего-то вроде:
- отображение 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 → Spring websocket
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
для всех моих объектов. И я мог бы быть слишком ленив для этого.
Идеи?
Ответы
Ответ 1
Сценарий 2 рассказывает о последнем клиенте на одном клиенте. Но я думал, что ваше требование предназначено для темы, так как вам нужно несколько клиентов.
Если бы я хотел выполнить 2 для вашего заявленного требования, вам может понадобиться вести список клиентов и реализовать свою собственную очередь или использовать ForkJoinPool для сообщения всем вашим клиентам, которые прослушивают ваши WebSockets. Сказав это, тема определенно более изящна здесь, но в целом выглядит слишком сложно с различными интерфейсами.
Для всех сообщений от клиента к серверу просто используйте простой проводной протокол и используйте коллекцию для параметризации, это может быть
RParam1.......
На сервере вам нужен контроллер для сопоставления этих данных с различными запросами (и операциями). Как-то не похоже на слишком много работы.
Надеюсь, это поможет.