0

假设我有一个名为“ WebSocketAdapter”的类,用@ServerWebSocket. 此类具有类似于聊天示例的 @OnOpen功能 @OnClose@OnMessage

在我的类中,我有一个在WebSocketBroadcaster. 在我的套接字函数中WebSocketSession,如果需要,我可以将其保存到对象中,但实际上我正在使用广播器向所有打开的套接字进行广播。

接下来,我有一个@Controller带有@Post控制器功能的类。这只是将发布的数据写入println.

这可能相关也可能不相关:我正在动态使用@SingletonPOST控制器。DefaultRouteBuilder@Inject

最后,我将我的index.html设置设置为静态资源,并使用一个简单的脚本来使用 websocket 将数据附加到 DOM。

所以,我可以站起来 micronaut,访问localhost并查看从我的套接字到页面的数据流。此外,我可以发布到我的端点并在控制台中查看数据。

我的问题是,当我发布到 post 控制器时,如何让我的套接字会话广播?我如何将 websocket 作为 post 控制器的依赖注入,以便我可以将发布到服务器的消息发送到所有打开的浏览器?注意:我正在使用 Kotlin,但对任何语言的任何建议都持开放态度。

我尝试过的事情:

  • 直接传递WebSocketSession到后控制器并希望它得到“豆类”

  • 尝试通过 BeanContext.run().getBean(WebSocketAdapter::class.javaClass)并使用它的广播器或会话来访问 bean

  • 制作@ServerWebSocketa@Singleton@Inject在会话上使用并尝试访问它

  • 试图找到 bean@ApplicationContext并使用它的会话

  • 使用 rx 在类之间传递数据(我熟悉 RxSwift)

我似乎收到了如下错误:Bean Context must support property resolution

文件说

WebSocketSession 默认由内存映射支持。如果添加会话模块,则可以在 HTTP 服务器和 WebSocket 服务器之间共享会话。

我已将会话模块添加到我的 .gradle 中,但是,我究竟如何在 micronaut 之间ws://以及http://与 micronaut 之间共享我的会话?

4

2 回答 2

0

这种技术对我有用:

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

在我的例子中,这段代码位于 micronaut 服务器的 GORM 对象的 afterInsert() 方法中。调用将进入控制器并更新 GORM 对象,然后将更改发送到侦听器。

于 2019-10-01T06:21:34.547 回答
0

不幸的是,Micronaut 中似乎没有等效的 SimpMessagingTemplate。我解决这个问题的方法是创建一个内部@WebSocketClient,它允许我连接到服务器。由于我授权它的方式,服务器将连接识别为内部连接,并将此套接字上的消息解释为解释和执行的命令。

它有效,但 SimpMessagingTemplate 会更好。

于 2018-11-29T12:44:34.463 回答