java - 定位特定的 Micronaut WebSocket 连接

标签 java kotlin websocket micronaut

我正在尝试创建一个 Kotlin 服务,该服务能够将数据从 Kafka 传递到(特定的)WebSocket 连接。 例如,如果来自用户的数据在 Kafka 上传递,程序会接收它,并且我希望将其传递到正确的 WebSocket 连接(如果该用户当前已连接)。

我拥有的基础知识是:

@KafkaListener()
@Controller
@Secured(SecurityRule.IS_ANONYMOUS)
@ServerWebSocket("/ws/{id}")
class WebSocket() {

    @OnOpen
    fun onOpen(session: WebSocketSession, id: String): Publisher<String> {
        return session.send("connection opened")
    }
}

但是,如果在同一个类中我收到一条 Kafka 消息,其中包含我正在查找的用户 ID,我如何将其传递到正确的 WebSocket 连接?

我想如果我使用网址中的 "/ws/{id}" 我可以轻松地将其发送到正确的 ID,但我不知道如何实现。

我知道将数据发送到连接的唯一方法是从 Websocket 带注释的函数内部,例如 OnOpen 和 OnMessage 等。 此外,我发现 Micronaut WebSocketBroadcaster 很有用,但当然仅适用于广播。

我想弄清楚的其他问题是在哪里确保连接到的 id 也是用户的实际 id 而不是其他人的,我应该在 @Secured 注释中实现它吗?

最佳答案

对于任何感兴趣的人,我确实找到了解决方案。 使用 Micronaut WebSocketBroadcaster您可以广播消息,并使用第二个参数,该参数采用 Predicate<WebSocketSession>它定义了它将消息发送到哪个 WebSocketSession。

如果您确实知道特定的 WebSocketSession ID,则可以简单地使用 { it.id == "id" }对于谓词,如示例 1 中所做的那样。 如果您确实需要根据其他一些属性将其发送给特定用户,您可以使用 session.attributes.put("id", id) 将属性分配给 WebSocketSession 本身。例如在 onOpen 函数中。您可以为此使用的谓词在示例 2 中,唯一的问题是我找不到一种方法来检索属性而不将其转换为 map ,这不是很漂亮。

class ExampleClass(val broadcaster: WebSocketBroadcaster) {
    val userId = "user_001"
    val webSocketId = "asdasdasd"

    // [1] Send message to a specific socket ID
    broadcaster.broadcast("message", { it.id == webSocketId)

    // [2] Send message to a user with specific ID or any other identifying attribute of choice
    broadcaster.broadcast("message", { it.attributes.asMap()["id"]?.equals(id) ?: false})    
}

关于java - 定位特定的 Micronaut WebSocket 连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60992957/

相关文章:

android - Kotlin-如何通过使用collection/data类存储包含4D数据的表

android - 如何从 R.raw 资源获取 java.io.File

javascript - 如何使用nodejs连接到实时服务器上的socket.io

java - 为什么我无法在 Java Web Socket 应用程序中写入 PrintWriter?

java - 如何防止屏幕旋转触发的onResume事件中跳过某个功能?

Java 如何创建唯一的对象名称?

java - 使用 picasso android 库加载图像形式 URL 时出现错误 HTTP 504

java - 从 Tomcat 9 到客户端的 Websocket 二进制消息拆分为 2 个或更多 tcp 数据包

java - 传承计划。我从哪说起呢?

java - 如何使用 Javascript 或 Java 编辑可编辑的 pdf 表单