Подтвердить что ты не робот

Как смешивать 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 для всех моих объектов. И я мог бы быть слишком ленив для этого.

Идеи?

4b9b3361

Ответ 1

Сценарий 2 рассказывает о последнем клиенте на одном клиенте. Но я думал, что ваше требование предназначено для темы, так как вам нужно несколько клиентов. Если бы я хотел выполнить 2 для вашего заявленного требования, вам может понадобиться вести список клиентов и реализовать свою собственную очередь или использовать ForkJoinPool для сообщения всем вашим клиентам, которые прослушивают ваши WebSockets. Сказав это, тема определенно более изящна здесь, но в целом выглядит слишком сложно с различными интерфейсами.

Для всех сообщений от клиента к серверу просто используйте простой проводной протокол и используйте коллекцию для параметризации, это может быть RParam1.......

На сервере вам нужен контроллер для сопоставления этих данных с различными запросами (и операциями). Как-то не похоже на слишком много работы. Надеюсь, это поможет.