踩踏来自客户端的消息确认

stomp message acknowledgement from client

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

流量大致如下:

  1. 服务通知特定用户有关决定并更新数据库中状态为 "notified"
  2. 的记录
  3. 客户端收到消息(使用stompClient.subscribe(...))
  4. 客户端确认已收到消息。
  5. 服务 "knows" 已确认此消息并将数据库中的状态更新为 "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);

在客户端,在处理订阅的方法中,但是没有用。

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

谢谢!

根据 spec 使用 ACK 框架。服务器发送 ack:some_id header,客户端在 ACK 帧中使用 some_id

简单经纪人的答案是

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

The simple broker is great for getting started but supports only a subset of STOMP commands (e.g. no acks, receipts, etc.), relies on a simple message sending loop, and is not suitable for clustering. As an alternative, applications can upgrade to using a full-featured message broker.