Я написал небольшой фрагмент кода для генерации отправленных сервером событий и соответствующий JavaScript клиент для регистрации всех сообщений. Когда я отправляю запрос, я вижу на вкладке сети chrome, что браузер получает все сообщения от сервера, но в JavaScript запускается только открытый прослушиватель событий и никогда не запускается прослушиватель сообщений. Я потратил на это много времени, но безуспешно.
Вот мой Java код, который генерирует SSE:
@GET
@Path("/updates/sse")
@Produces(MediaType.SERVER_SENT_EVENTS)
public void publishUpdates(@Context SseEventSink sseEventSink) {
new Thread(() -> {
for (int i = 0; i < 10; i++) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
final OutboundSseEvent event = sse.newEventBuilder()
.name("message-to-client")
.data(String.class, "Hello world " + i + "!")
.build();
sseEventSink.send(event);
}
}).start();
}
Вот мой JavaScript код для обработки ответа:
if(typeof(EventSource) !== "undefined") {
var source = new EventSource("/gra/services/updates/sse");
source.addEventListener('message', function(e) {
console.log("message");
console.log(e.data);
}, false);
source.addEventListener('open', function(e) {
// Connection was opened.
console.log("open");
}, false);
source.addEventListener('error', function(e) {
console.log("error");
console.log(e);
if (e.readyState == EventSource.CLOSED) {
// Connection was closed.
}
}, false);
} else {
document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events...";
}
Вот что я получаю в консоли в chrome. Вызывается только открытый слушатель:
, и вот что я вижу на вкладке Сеть в chrome:
Я пытаюсь выяснить, получает ли браузер данные о событиях, почему не вызывается прослушиватель сообщений.