当前位置: 首页 > 知识库问答 >
问题:

如何发送消息到一个特定的订阅通过Spring webSocket STOMP?

盖嘉珍
2023-03-14

我用的是带Spring靴的网靴。是否有可能向特定订阅发送消息?根据STOMP文档,我使用包含id字段的STOMP头订阅STOMPendpoint,我希望使用此id确定应该接收消息的客户端,但是spring似乎没有使用这个id。我不能只使用sendToUser,因为两个客户端可以具有相同的用户id,例如,如果一个用户有两个打开的浏览器窗口。只有一个特定窗口应接收该消息。

在下面的示例中,我有两个连接的客户端,它们使用相同的用户,但在STOMP标头中使用不同的id。

客户ID:a32d66bf-03c7-47a4-aea0-e464c0727842

客户2 ID:b3673d33-1bf2-461e-8df3-35b7af07371b

在spring中,我执行了以下Kotlin代码:

val subscriptions =  userRegistry.findSubscriptions {
            it.destination == "/user/topic/operations/$operationId/runs"
        }
        subscriptions.forEach{
            println("subscription id: ${it.id}");
            println("session id: ${it.session.id}");
            println("user id ${it.session.user.name}");
        }

输出:

subscription id: sub-7
session id: mcjpgn2i
user id 4a27ef88-25eb-4175-a872-f46e7b9d0564
subscription id: sub-7
session id: 0dxuvjgp
user id 4a27ef88-25eb-4175-a872-f46e7b9d0564

没有迹象表明我已经传递给跺脚头的id。

是否可以将消息发送到一个特定的订阅,该订阅由我通过标头的id确定?

共有1个答案

索令
2023-03-14

我让它工作了。

首先,我的客户端设置有问题。我在连接头中设置了订阅id,如下所示:

this.stompClient.webSocketFactory = (): WebSocket => new SockJS("/ws");
this.stompClient.connectHeaders = { id: subscriptionId };
this.stompClient.activate();

但必须在订阅标头中设置订阅标头:

this.stompClient.subscribe(this.commonEndpoint,
        this.onMessageReceived.bind(this),
        { id: subScriptionId });

如果我这样做,spring将正确地使用这个id作为订阅id,而不是使用一些默认的sub-7。

根据该线程,我可以向特定会话而不是用户发送消息。

通过以下代码,我可以向特定订阅发送消息:

val subscriptions = userRegistry.findSubscriptions {
            it.destination == "/user/topic/operations/$operationId/runs"
        }
subscriptions.forEach {
    if(it.id === mySubscriptionId){
        val headerAccessor = 
        SimpMessageHeaderAccessor.create(SimpMessageType.MESSAGE)
        headerAccessor.sessionId = it.session.id
        headerAccessor.setLeaveMutable(true)

        simpMessagingTemplate.convertAndSendToUser(it.session.id,  
            "/topic/operations/runs", messageResponseEntity,
            headerAccessor.getMessageHeaders())

     }
}
 类似资料:
  • 找到要发消息的订阅号-“群发消息”-新建群发消息 1)根据内容选择发送图文消息、文字消息、图片消息和文件消息。 2)选择群发范围,全部用户或部分用户,选择部分用户时支持选择组织机构或成员。 3)支持从素材库中选择,或直接新建图文消息。以“新建图文消息”为例: 备注:“保存”只是保存在“素材管理”里,没有发送出去,如果既要保存又要发送,请点击“保存并发送”。 4)除了图文、图片、文字消息,订阅号还可

  • 我对Spring websocket相当陌生。我有一个简单的演示如下: HandshakeInterceptor类: } WebsocketEndPoint类: } Spring映射webSocket: Html: 现在我想向特定用户发送一条消息。我定义每个设备都有一个deviceId,所以我想知道: 如何与属性握手,这将从客户端发送? 如何从客户端javascript发送握手属性? 如何通过握手

  • 我目前正在使用Java和jda为discord制作一个机器人。我想让机器人向特定的通道发送消息。我该怎么做?

  • 如何要求机器人将消息发送到与机器人接收命令不同的另一个通道(特定通道)? 假设bot在通道中收到消息,如果操作完成,则bot发送给通道。 code:

  • 主要内容:一、通知,二、源码分析,三、总结一、通知 在Redis中,既可以实现消息的发送又可以实现订阅,也就是常说的发布/订阅。它的主要逻辑实现在nofigy.c和module.c、pubsub.c中,其实通知做为一种辅助功能,是易用性的一种良好的接口。Redis的通知功能是一种即时在线通知功能,如果CS端断线后,相关的消息就无法再次通知,也就是说,消息机制没有保存和重发功能。这也是为了实现设计上的简单和功能实现的鲁棒性的考虑,至于以后会