2015-03-30 20 views
6

Utilizzo il framework spring/stomp/websocket per notificare gli utenti dei messaggi in modo asincrono. L'ho fatto con successo. Tuttavia, vorrei ottenere ACK dal client in modo che alcune azioni sul lato server possano aver luogo quando questo è fatto.conferma messaggio stomp dal client

Il flusso è più o meno come i flussi:

  1. Servizio notifica a un utente specifico di una decisione e aggiorna un record nel DB con stato =
  2. Client "notificato" riceve il messaggio (utilizzando stompClient.subscribe (...))
  3. Il client riconosce che il messaggio è stato ricevuto.
  4. Il servizio "sa" che questo messaggio è stato riconosciuto e aggiorna lo stato su "ACK" nel DB.

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

Nel servizio, il messaggio viene inviato:

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

Esiste un modo per gestire l'ACK client sul lato server? In alternativa, ho cercato di fare un

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

sul client, nel metodo che gestisce l'abbonamento, ma invano.

Qualcuno può dirmi qual è il modo standard per gestire i riconoscimenti? Ho lottato con questo per un paio di giorni e ogni pensiero sarebbe stato molto utile.

Grazie!

+0

Potrei superare il mio problema eseguendo manualmente uno stompClient.send (...) dopo aver ricevuto il messaggio. Questo non è l'ACK perfetto, volevo usarlo, ma per ora funziona. Sarà ideale sapere come gli ACKS sono gestiti dal framework Spring Stomp Ws. – myspri

risposta

1

Utilizzare il frame ACK come da spec. Il server invia un'intestazione ack:some_id, il client usa quello some_id nel frame ACK.

+1

Ma come non gestirlo sul lato server? – user1633272