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

时间:2014-10-20 20:03:52

标签: stomp spring-websocket

我正在开发一个利用websockets工具的Spring应用程序。为了使其更强大,我按照文档中的说明使用STOMP / SimpleBrokerMessageHandler。一切顺利,我已经能够快速连接javasctipt客户端,所以我转而使用“androidasync”库在Android客户端上工作。

我发现的是,在客户端处理SUBSCRIBE请求后,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案件的预期......

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

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

1 个答案:

答案 0 :(得分:3)

所以我在阅读STOMP Documentation

时遇到了这些信息
  

标题收据

     

除CONNECT之外的任何客户端框架都可以指定收据标头   任意值。这将导致服务器确认   使用RECEIPT帧处理客户端帧(参见RECEIPT   框架了解更多细节)。

看起来像你想要的,虽然我还没有确认弹簧实现是否真的这样做。