Я настроил 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