Допустим, у меня есть класс с именем «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)и использовать его вещатель или сеансСоздание
@ServerWebSocketa@Singleton, использование@Injectв сеансе и попытка доступа к немуПопытка найти bean-компонент с помощью
@ApplicationContextи использовать его сеансИспользование rx для передачи данных между классами (я знаком с RxSwift)
Кажется, я получаю сообщение об ошибке: Bean Context must support property resolution
В документации говорится
WebSocketSession по умолчанию поддерживается картой в памяти. Однако если вы добавите модуль сеанса, вы можете совместно использовать сеансы между HTTP-сервером и сервером WebSocket.
Я добавил модуль сеанса в свой .gradle, однако, как мне поделиться своими сеансами между ws:// и http:// с помощью micronaut?