2015-03-30 19 views
6

Ich benutze Spring/Stomp/Websocket-Framework, um Benutzer von Nachrichten asynchron zu benachrichtigen. Ich habe das erfolgreich gemacht. Allerdings würde ich ACK vom Client erhalten, so dass einige serverseitige Aktionen stattfinden können, wenn dies erledigt ist.stomp Nachricht Bestätigung vom Client

Der Fluss ist etwa so fließt:

  1. Dienst einen bestimmten Benutzer über eine Entscheidung informiert und aktualisiert einen Datensatz in der DB mit dem Status = „gemeldet“
  2. -Client die Nachricht empfängt (mit stompClient.subscribe (...))
  3. Der Client bestätigt, dass die Nachricht empfangen wurde.
  4. Der Dienst "weiß", dass diese Nachricht bestätigt wurde, und aktualisiert den Status in der DB auf "ACK".

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

Im Dienst wird die Nachricht gesendet:

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

Gibt es eine Möglichkeit, den Client ACK auf der Serverseite zu behandeln? Alternativ habe ich versucht, ein

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

auf dem Client, die in dem Verfahren zu tun, die das Abonnement behandelt, aber vergeblich.

Kann mir bitte jemand sagen, wie man mit Bestätigungen normalerweise umgehen kann? Ich habe ein paar Tage damit zu kämpfen und alle Gedanken wären sehr hilfreich.

Danke!

+0

Ich könnte mein Problem umgehen, indem ich manuell einen stompClient.send (...) nach Erhalt der Nachricht mache. Das ist nicht das perfekte ACK, das ich verwenden wollte, aber das funktioniert jetzt. Es ist ideal zu wissen, wie ACKS mit dem Spring Stomp ws Framework gehandhabt werden. – myspri

Antwort

1

Verwenden Sie den ACK Rahmen gemäß spec. Der Server sendet einen ack:some_id Header, der Client verwendet diesen some_id im ACK Frame.

+1

Aber wie funktioniert das nicht auf der Serverseite? – user1633272

0

Die Antwort ist keine für einfache Broker.

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

Die einfache Broker ist für den Einstieg, sondern unterstützt nur eine Teilmenge von STOMP Befehle (zB keine acks, Quittungen, etc.), auf einer einfache Nachricht sendet Schleife beruht, und ist nicht zum Clustering geeignet. Als Alternative können Anwendungen auf die Verwendung einer voll funktionsfähigen Nachricht Broker aktualisieren.