【问题标题】:Passing data from a POST request and broadcasting to a websocket in Micronaut从 POST 请求传递数据并广播到 Micronaut 中的 websocket
【发布时间】:2018-10-16 03:02:54
【问题描述】:

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

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

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

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

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

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

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

我尝试过的事情:

  • WebSocketSession 直接传递到后控制器并希望它 在

  • 中得到'beaned'
  • 尝试通过以下方式访问 bean BeanContext.run().getBean(WebSocketAdapter::class.javaClass) 并使用它的广播或会话

  • @ServerWebSocket 设置为@Singleton 并使用@Inject 会话并尝试访问它

  • 尝试使用@ApplicationContext 查找bean 并使用它的会话

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

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

文档说

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

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

【问题讨论】:

    标签: post websocket kotlin javabeans micronaut


    【解决方案1】:

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

    它有效,但 SimpMessagingTemplate 会更好。

    【讨论】:

      【解决方案2】:

      这项技术对我有用:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-10
        相关资源
        最近更新 更多