【问题标题】:stomp message acknowledgement from clientstomp 来自客户端的消息确认
【发布时间】:2015-06-04 00:02:02
【问题描述】:

我正在使用 spring/stomp/websocket 框架来异步通知用户消息。我已经成功地做到了。但是,我会从客户端获得 ACK,以便在完成后可以执行一些服务器端操作。

流程大致如流程:

  1. 服务通知特定用户有关决定并更新数据库中状态 = "notified" 的记录
  2. 客户端接收消息(使用 stompClient.subscribe(...))
  3. 客户端确认已收到消息。
  4. 服务“知道”此消息已被确认,并在 DB 中将状态更新为“ACK”。

    stompClient.connect({login:'guest', passcode:'guest'}, 
           function(frame) {
             setConnected(true);
             **var headers = {ack: 'client'};**
            ...
    
    
        stompClient.subscribe('/user/guest/response',function(notification) {
            //doSomething
        }), **headers**);
    }
    

在服务中,发送消息:

  this.messagingTemplate.convertAndSendToUser(user, "/response",msg, map);

有没有办法在服务器端处理客户端 ACK? 或者,我尝试做一个

stompClient.send("/app/response/ack/"+messageId);

在客户端,在处理订阅的方法中,但徒劳无功。

谁能告诉我处理确认的标准方法是什么?我已经为此苦苦挣扎了几天,任何想法都会非常有帮助。

谢谢!

【问题讨论】:

  • 我可以通过在收到消息后手动执行 stompClient.send(...) 来解决我的问题。这不是我想要使用的完美 ACK,但现在可以使用。最好了解 spring stomp ws 框架如何处理 ACKS。

标签: spring websocket stomp subscribe


【解决方案1】:

按照spec 使用ACK 框架。服务器发送一个ack:some_id 标头,客户端在ACK 帧中使用该some_id

【讨论】:

  • 但是,spring 怎么不在服务器端处理这个?
【解决方案2】:

对于简单的代理,答案是

https://docs.spring.io/spring/docs/current/spring-framework-reference/html/websocket.html

简单的代理非常适合入门,但仅支持 STOMP 命令的子集(例如没有确认、收据等),依赖于 简单的消息发送循环,不适合集群。作为一个 或者,应用程序可以升级到使用全功能消息 经纪人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-24
    • 2013-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-12-19
    • 2019-05-16
    • 1970-01-01
    相关资源
    最近更新 更多