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

Spring STOMP订阅的最佳实践-订阅消息确认

琴修为
2023-03-14

我正在开发一个利用websockets功能的Spring应用程序。为了使它更健壮,我使用了STOMP/SimpleBrokerMessageHandler,如文档中所述。一切进展顺利,我已经能够非常快速地连接javasctipt客户端,所以我转而使用“AndroidSync”库在Android客户端上工作。

我发现的事实是,Android客户端(我想其他客户端也是如此)在服务器处理订阅请求后没有收到任何反馈。阅读SimpleBrokerMessageHandler的源代码可以确认:

    if (SimpMessageType.SUBSCRIBE.equals(messageType)) {
        this.subscriptionRegistry.registerSubscription(message);
    }
    else if (SimpMessageType.UNSUBSCRIBE.equals(messageType)) {
        this.subscriptionRegistry.unregisterSubscription(message);
    }
    else if (SimpMessageType.MESSAGE.equals(messageType)) {
        sendMessageToSubscribers(headers.getDestination(), message);
    }
    else if (SimpMessageType.DISCONNECT.equals(messageType)) {
        String sessionId = headers.getSessionId();
        this.subscriptionRegistry.unregisterAllSubscriptions(sessionId);
    }
    else if (SimpMessageType.CONNECT.equals(messageType)) {
        SimpMessageHeaderAccessor replyHeaders = SimpMessageHeaderAccessor.create(SimpMessageType.CONNECT_ACK);
        replyHeaders.setSessionId(headers.getSessionId());
        replyHeaders.setHeader(SimpMessageHeaderAccessor.CONNECT_MESSAGE_HEADER, message);

        Message<byte[]> connectAck = MessageBuilder.withPayload(EMPTY_PAYLOAD).setHeaders(replyHeaders).build();
        this.clientOutboundChannel.send(connectAck);
    }

它清楚地表明,它不会返回CONNECT案例的任何期望...

我似乎绝对需要有一种方法来确保客户端订阅请求已经被处理好或被拒绝,或者在中间某个地方或类似的事件中抛出异常。我如何验证它是否已被处理?在这种情况下,推荐的方法是什么?

我不能只是在频道上发布一条假消息,然后检查它是否通过订阅路由回客户端,因为其他客户端可能会订阅它,因此也会收到这个假消息。这真的不是一个好的选择。

共有1个答案

秦阳旭
2023-03-14

所以我在阅读STOMP文档时发现了这些信息

标题收据

除CONNECT之外的任何客户端框架都可以指定具有任意值的接收头。这将导致服务器使用接收帧确认客户端帧的处理(有关更多详细信息,请参阅接收帧)。

看起来像你想要的,尽管我还没有确认spring实现是否真的做到了这一点。

 类似资料:
  • 微信文档:https://developers.weixin.qq.com/miniprogram/dev/api-backend/open-api/subscribe-message/subscribeMessage.addTemplate.html 组合模板并添加至帐号下的个人模板库 $tid = 563; // 模板标题 id,可通过接口获取,也可登录小程序后台查看获取 $kidLi

  • 开普勒消息目前分为三大类:公告,告警和通知。 通知中根据不同的操作事件类型,分为十几个事件。每个事件都跟项目操作相关。便于接收项目操作变更的通知。 分类 事件 公告 Alarm 告警 Proclaim 通知 Build,Apply,Audit,Delete,Rollback,Logging,Reboot,Command,Storage,Extend... 订阅界面: 用户中心,点击头像,下拉菜单→

  • 我是新的数据流和发布子工具在GCP。 需要将prem过程中的电流迁移到GCP。 当前流程如下: 我们有两种类型的数据馈送 Full Feed–其adhoc作业–完整XML的大小约为100GB(单个XML–非常复杂的一个–完整的数据–ETL作业处理此XML并将其加载到约60个表中) 单独的ETL作业用于处理完整提要。ETL作业过程完全馈送并创建负载就绪文件,所有表将被截断并重新加载 源系统每30分钟

  • 我使用SockJS和StompJS,当我在浏览器中打开我的应用程序时,有时它会在连接到websocket之前尝试订阅一些主题。我希望主题订阅等待应用程序连接到websocket。 这就是我实现此代码的原因,我将其称为: 因此,我只在连接状态为时才订阅该主题,并且只有在客户端首次成功连接时才会调用该主题。 我想稍后从主题中取消订阅,所以我需要内部订阅返回的对象,我还需要内部订阅的消息。 我所实现的很

  • 订阅收到的whisper消息。 调用: web3.shh.subscribe('messages', options [, callback]) 参数: "messages" - String: 订阅类型 options:Object - 订阅选项,有如下字段: symKeyID - String: 用于消息解密的对称密钥 privateKeyID - String: 用于消息解密的私钥 sig

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