Передача данных из запроса POST и трансляция в веб-сокет в Micronaut - PullRequest
0 голосов
/ 16 октября 2018

Допустим, у меня есть класс с именем "WebSocketAdapter", помеченный @ServerWebSocket.Этот класс имеет функции @OnOpen, @OnClose, @OnMessage, подобные примеру чата.

Внутри моего класса у меня есть конструктор, который передается в WebSocketBroadcaster.Внутри моих функций сокетов у меня есть WebSocketSession, который я могу сохранить на объекте, если захочу, но на самом деле я использую вещатель для вещания на все открытые сокеты.

Далее у меня есть @Controllerкласс с @Post функцией контроллера.Это просто записывает опубликованные данные с println.

. Это может иметь или не иметь значение: я использую @Singleton с DefaultRouteBuilder до @Inject контроллера POST динамически.

Наконец, мой index.html настроен как статический ресурс с простым скриптом, созданным для использования веб-сокетов и добавления данных в DOM.

Итак, я могу встать с микронавтом, посетить localhost и посмотреть данныепоток из моего сокета на страницу.Кроме того, я могу отправлять сообщения на конечную точку и просматривать данные в консоли.

Мой вопрос заключается в том, как сделать так, чтобы сеанс моего сокета транслировался, когда я отправляю сообщения на пост-контроллер?Как именно я добавляю websocket как зависимость от пост-контроллера, чтобы я мог отправить сообщение, отправленное на сервер, во все открытые браузеры?Примечание: я использую Kotlin, но открыт для любых предложений на любом языке.

Вещи, которые я пробовал:

  • Передача WebSocketSession непосредственно в пост-контроллер и надеюсь, что этополучает 'beaned' в

  • Попытка получить доступ к bean через BeanContext.run().getBean(WebSocketAdapter::class.javaClass) и использовать его вещатель или сеанс

  • Создание @ServerWebSocket a@Singleton и использование @Inject в сеансе и попытка доступа к нему

  • Попытка найти компонент с помощью @ApplicationContext и использовать его сеанс

  • Использование rx для передачи данных между классами (я знаком с RxSwift)

Кажется, я получаю сообщение об ошибке вроде: Bean Context must support property resolution

В документации говорится

WebSocketSession по умолчанию поддерживается картой в памяти.Если вы добавите модуль сеанса, вы, однако, сможете совместно использовать сеансы между сервером HTTP и сервером WebSocket.

Однако я добавил модуль сеанса в мой .gradle, как именно я делюсь своими сеансами междуws:// и http:// с микронавтом?

1 Ответ

0 голосов
/ 29 ноября 2018

К сожалению, в Micronaut нет эквивалента SimpMessagingTemplate.Они решили, что мне нужно было создать внутренний @WebSocketClient, который позволял мне подключаться к серверу.Сервер распознает соединение как внутреннее благодаря тому, как я его авторизую, и интерпретирует сообщения в этом сокете как команды, которые интерпретируются и выполняются.

Это работает, но SimpMessagingTemplate будет лучше.

...