Код: Выделить всё
SseEmitter sseEmitter = new SseEmitter(30000L)< /code> < /p>
[*] Указывает максимальное количество времени (в миллисекундах), что сервер может удерживать холостое время SSE. Если данные не отправляются клиенту в течение 30 секунд, сервер автоматически запускает Outtimeout и закроет соединение.
Как только будет установлено соединение SSE, оно будет закрыто через 30 секунд, независимо от того, был ли Sseemitter.send () Код: Выделить всё
SSE
let chat = document.getElementById("con");
if (window.EventSource) {
const eventSource = new EventSource('http://localhost:8080/peace/subscribe?uid=456');
eventSource.onopen = function () {
console.log('SSE seccuss');
};
eventSource.onmessage = function (event) {
console.log("message:", event.data);
};
eventSource.onerror = function (error) {
console.log('SSE error', error);
};
} else {
alert("你的浏览器不支持SSE");
}
< /code>
Это мой код Java : < /p>
public SseEmitter subscribe(String uid) {
SseEmitter sseEmitter = new SseEmitter(10000L);
sseEmitter.onCompletion(() -> {
sseEmitterMap.remove(uid);
});
sseEmitter.onTimeout(() -> {
System.out.println(Calendar.getInstance().getTime());
});
sseEmitter.onError(throwable -> {
try {
sseEmitter.send(SseEmitter.event().id(uid)
.name("has error!")
.data("has error!")
.reconnectTime(3000));
sseEmitterMap.put(uid, sseEmitter);
} catch (IOException e) {
e.printStackTrace();
}
});
sseEmitterMap.put(uid, sseEmitter);
return sseEmitter;
}
public boolean sseChat(String uid, String messageId, String message) {
SseEmitter sseEmitter = sseEmitterMap.get(uid);
if (sseEmitter == null) {
return false;
}
Executors.newSingleThreadScheduledExecutor().scheduleAtFixedRate(() -> {
try {
sseEmitter.send("Data at " + System.currentTimeMillis());
System.out.println("Data sent successfully");
} catch (IOException e) {
sseEmitter.completeWithError(e);
}
}, 0, 1, TimeUnit.SECONDS);
return true;
}
Подробнее здесь: https://stackoverflow.com/questions/796 ... sseemitter