Невозможно ввести сообщение с SSE (Java Servlet + ES6 JS) - PullRequest
0 голосов
/ 16 мая 2018

Я пытался сделать пример SSE, как в этом видео https://www.youtube.com/watch?v=rhCKCKD0KnA

    response.setContentType("text/event-stream");
    response.setCharacterEncoding("UTF-8");

    PrintWriter printWriter = null;

    while(true) {

        try {
            double rnd = Math.random() * 10000;

            printWriter = response.getWriter();
            printWriter.print("Rnd: " + rnd);

            response.flushBuffer();


            Thread.sleep(5000);

        }
        catch(IOException | InterruptedException e) {
            e.printStackTrace();

            printWriter.close();

            break;
        }


    }

И на стороне клиента

    window.onload = function () {

        startButton.onclick = () => {
            eventSource = new EventSource('http://localhost:8080/byteslounge-1/sse_test');

            eventSource.onopen = () => {
                displayTextArea.value += 'connected...' + '\n';
            };

            eventSource.onmessage = (message) => {
                displayTextArea.value += message.data + '\n\n';
            };

            eventSource.onerror = () => {
                displayTextArea.value += 'error occured...' + '\n';
            };

            startButton.disabled = true;
        };

        takeMsg.onclick = () => {
            eventSource.onmessage = (message) => {
                displayTextArea.value += message.data + '\n\n';
            };
        };

        stopButton.onclick = () => {
            eventSource.close();
            startButton.disabled = false;
        };

        clearText.onclick = () => {
            displayTextArea.value = '';
        }

    }

Соединение в порядке, но не может получить никаких данных в onMessage. Нет ошибок / предупреждений на сервере / клиенте. Я использую FF 64 бит последней версии / JDK 1.8 / Payara.

1 Ответ

0 голосов
/ 17 мая 2018

Я не вижу очевидной проблемы в вашем коде.Однако при использовании Payara 5 я рекомендую использовать JAX-RS SSE API вместо того, чтобы кодировать его самостоятельно в сервлете.

См. Пример и руководство здесь: http://ridingthecrest.com/blog/2017/02/22/jax-rs-2_1-new-feature-introduction.html

Альтернатива вашейконечная точка сервера с JAX-RS SSE:

@Path("server-sent-events")
@Singleton
public class ServerSentEventsResource {

    @GET
    @Produces(MediaType.SERVER_SENT_EVENTS)
    public void getMessageQueue(@Context SseEventSink eventSink, @Context Sse sse) {

      while(true) {

        try {
            double rnd = Math.random() * 10000;

            eventSink.send(sse.newEvent("custom-message"));

            Thread.sleep(5000);

        }
        catch(IOException | InterruptedException e) {
            e.printStackTrace();

            printWriter.close();

            break;
        }
      }
    }
}

Также проверьте конечную точку сервера с помощью общего клиента SSE, например, curl поддерживает SSE и печатает входящие события по мере их поступления.Если это работает, то ваш клиент JavaScript имеет ошибку.

...