Die grundlegende Abfolge der Ereignisse sollten in einem anderen Rahmen ähnlich sein, aber dieses Beispiel ist Grails 3.3 haben.
Zuerst Endpunkte zum Abonnieren einrichten und die Verbindung schließen.
def index() {
// handler for GET /api/subscribe
rx.stream { Observer observer ->
// This is the Grails event bus. background tasks,
// services and other controllers can post these
// events, CLIENT_HANGUP, SEND_MSG, which are
// just string constants.
eventBus.subscribe(CLIENT_HANGUP) {String msg ->
// Code to handle when the grails event bus
// posts CLIENT_HANGUP
// Do any side effects here, like update your counter
// Close the SSE connection
observer.onCompleted()
return
}
eventBus.subscribe(SEND_MSG) {String msg ->
// Send a Server Sent Event
observer.onNext(rx.respond(msg))
}
}
}
def disconnecting()
{
// handler for GET /api/disconnect
// Post the CLIENT_HANGUP event to the Grails event bus
notify(CLIENT_HANGUP, 'disconnect')
}
nun in dem Client, müssen Sie GET /api/disconnect
, wenn Ihr Anwendungsfall erfordert es zu arrangieren. Angenommen, Sie möchten bemerken, wenn jemand von Ihrer Seite weg navigiert, können Sie eine Funktion unter window.onbeforeunload
registrieren. In diesem Beispiel wird Vue.js
und Axios
verwendet.
window.onbeforeunload = function (e) {
e.preventDefault()
Vue.$http({
method: 'get',
url: 'http://localhost:8080/api/disconnect'
})
.then((response) => { console.log(response) })
.catch(({error}) => { console.log(error) })
}
Im Fall von Servlet-Stacks wie Grails, fand ich, dass ich dies auch tun musste, wenn ich kein Housekeeping meiner eigenen zu tun hatte, wenn der Browser wegging. Ohne sie verursachten Seitenladevorgänge am hinteren Ende IOExceptions.
Aus Interesse, warum möchten Sie das wissen? – baynezy
Nun, ich habe einen Zähler, der erhöht wird, wenn ein Benutzer sie abonniert und möchte es verringern, wenn sie sich abmelden ... das ist alles –