Отправленные сервером события: JavaScript события не работают - PullRequest
0 голосов
/ 16 апреля 2020

Я написал небольшой фрагмент кода для генерации отправленных сервером событий и соответствующий 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. Вызывается только открытый слушатель: enter image description here

, и вот что я вижу на вкладке Сеть в chrome:

enter image description here

Я пытаюсь выяснить, получает ли браузер данные о событиях, почему не вызывается прослушиватель сообщений.

1 Ответ

0 голосов
/ 18 апреля 2020

См. Пример в документации для EventSource :

  /* The event "message" is a special case, as it
   * will capture events without an event field
   * as well as events that have the specific type
   * `event: message` It will not trigger on any
   * other event type.
   */
  sse.addEventListener("message", function(e) {
    console.log(e.data)
  })

Тип вашего сообщения message-to-client, а не "ничто".

...