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

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

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

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

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

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

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

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

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

  • Передача WebSocketSession непосредственно в пост-контроллер и в надежде, что он будет обработан

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

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

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

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

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

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

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

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


person Brooks DuBois    schedule 16.10.2018    source источник


Ответы (2)


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

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

person Sean McLaughlin    schedule 29.11.2018

Эта техника сработала для меня:

def sockServer = Application.ctx.getBean(MySocketServer)
sockServer.notifyListeners("you've been notified!")

В моем случае этот код находится в методе afterInsert () в объекте GORM на сервере микронавтов. Вызовы будут поступать в контроллер и обновлять объект GORM, а изменения отправляются слушателю.

person Ben Lucchesi    schedule 01.10.2019