Java-сервер не отправляет события сообщений со службой отправленных событий (SSE) OutboundSseEvent / JAX-RS - PullRequest
0 голосов
/ 09 ноября 2019

Я настроил SSE (server-sent-events) на Java-сервере. Клиент построен на VueJS и использует пакет EventSource для получения событий от сервера. Я использую пакет EventSourcePolyfill npm https://www.npmjs.com/package/event-source-polyfill на клиенте. Этот пакет позволяет нам отправить заголовок авторизации (для нашей схемы безопасности) с запросом.

Клиент отправляет запрос в нашу службу SSE и получает одно событие типа "open". Затем SSE не отправляет дальнейшие события или отправляет события, и браузер не обнаруживает их. Почему это? Предложения по починке? Там нет сообщений об ошибках.

Такое поведение наблюдается в Chrome, Firefox и Edge, поэтому, вероятно, оно не имеет ничего общего с браузером.

Our client method...
    testSSE() {
      console.log("in testSSE()");
      console.log("apikey: " + store.user.apikey);
      var EventSource = EventSourcePolyfill;

      const evtSource = new EventSource(
        "http://localhost:8081/api/ssetest/test",
        { headers: { Authorization: "Bearer " + store.user.apikey } }
      );
      evtSource.onmessage = function(event) {
        console.log("received message");
        console.log("event.data: " + event.data);
      };

       //This is the only function that gets hit
      evtSource.addEventListener("open", function(event) {
        console.log("open event");
        console.log(Object.keys(event));
        console.log(event.type);
      });
      evtSource.addEventListener("message", function(event) {
        console.log("message event");
      });
      evtSource.addEventListener("stringEvent", function(event) {
        console.log("received ping event");
        console.log("event.data: " + event.data);
      });
      evtSource.onerror = function(err) {
        console.error("EventSource failed:", JSON.stringify(err));
      };
    }

Это код нашего сервера ... @Path ("ssetest") открытый класс SSETestService расширяет SecureService {

@GET
@Path("/test")
@Produces("text/event-stream")
public void runTest(@Context Sse sse, @Context SseEventSink sseEventSink)
         {
    int lastEventId = 0;// ..;
    while (lastEventId < 10) {
        OutboundSseEvent stringEvent = sse.newEventBuilder()
                .name("" + lastEventId)
                .mediaType(MediaType.APPLICATION_JSON_TYPE)
                .data("hello world")
                .id(String.valueOf(lastEventId))
                .reconnectDelay(4000) // .comment("price change")
                .build();
        sseEventSink.send(stringEvent);
        lastEventId++;
        TimeUnit.SECONDS.sleep(1);

    }
}

}

Browser console output...
[![enter image description here][1]][1]


  [1]: https://i.stack.imgur.com/iR57U.png
...