Ich benutze serverseitige Ereignisse (SSE) in Java Spring. Jedes Mal, wenn ein neuer Client abonniert das Ereignis Service, den ich den folgenden Code an dem REST-Controller ausführen:Java Frühling SseEmitter/ResponseBodyEmitter: Ermitteln Browser neu geladen
SseEmitter emitter = new SseEmitter(-1L);
emitter.onCompletion(() -> {
logger.debug(TAG + "Emitter completed.");
emitters.remove(emitter);
});
return emitter;
Dann, wenn ein Ereignis an den Kunden mitgeteilt werden muß ich ausführen:
for (ResponseBodyEmitter emitter: emitters) {
emitter.send("Message #1");
}
Das Problem Wenn einer der Clients den Browser neu lädt, wird der Emitter nicht (wie erwartet) abgeschlossen, und beim Aufruf des obigen Codes erhalte ich eine Ausnahme für unterbrochene Pipes. Erst nachdem diese Ausnahme ausgelöst wurde, sehe ich, dass der Emitter abgeschlossen ist.
Gibt es eine Möglichkeit, dieses Problem zu lösen?
Wie behandeln Sie mehrere Registerkarten, die JWT wird für alle Registerkarten in der Sitzung gleich sein, richtig? – TruckDriver
Was ist, wenn der Client die App abrupt schließt, nie wieder für 30 Tage, die alte Verbindung bleibt noch offen? Dies funktioniert auch nicht gut, wenn mehrere App-Server loadbalanced sind - da sich der Benutzer beim erneuten Verbinden mit einem anderen AS verbinden kann. Dies scheint kein vielversprechender Ansatz zu sein. – user1102532
Nein, der SseEmitter wird mit einem Zeitüberschreitungswert im Konstruktor erstellt. Die Zeitüberschreitung bezieht sich nicht auf Leerlauf, sondern eher auf "Time-to-Live". Durch den Entwurf werden die Verbindungen alle z. X Sekunden/Minuten, und der Client wird es neu erstellen ... wenn es noch benötigt wird. Beim Lastenausgleich muss der Servercode natürlich nicht auf den Status im Arbeitsspeicher angewiesen sein, um die Sitzung des Clients neu zu erstellen, wenn der Client eine Verbindung herstellt oder die Verbindung wieder herstellt. Aber noch einmal, das Design des SSE und auch des Spring SseEmitter ist inhärent sitzungs-/verbindungsorientiert, so lange die Verbindung besteht, können Sie in mem arbeiten. –