Клиент Jersey SSE не получает событий

Я пытаюсь реализовать клиент Server-Sent-Events, используя Джерси 2.5.1 (не могу перейти на более позднюю версию), и соединение продолжает закрываться, а события не считываются. Я сократил код до того, что, по моему мнению, является самым простым из возможных, следуя руководству, но безуспешно.

Я проверил свой клиент на других серверах, и поведение такое же, поэтому я считаю, что моя проблема связана с клиентом. Клиент подключается к ресурсу, и сервер начинает отправлять события. Но никаких событий не поступает, и соединение закрывается преждевременно.

Я также пробовал использовать EventSource вместо EventInput, но результаты те же. Может кто-нибудь, пожалуйста, скажите мне, что мне не хватает? Спасибо.

Код сервера:

@Path("events")
public class SseResource {

  /**
   * Create stream.
   * @return chunkedOutput of events.
   */
  @GET
  @Produces(SseFeature.SERVER_SENT_EVENTS)
  public EventOutput getServerSentEvents() {
    System.out.println("Received GetEvent");
    final EventOutput eventOutput = new EventOutput();
    new Thread(new Runnable() {
      @Override
      public void run() {
        try {
          for (int i = 0; i < 10; i++) {

            final OutboundEvent.Builder eventBuilder = new OutboundEvent.Builder();
            eventBuilder.name("message-to-client");
            eventBuilder.data(String.class, "Hello world " + i + "!");
            final OutboundEvent event = eventBuilder.build();
            eventOutput.write(event);
            System.out.println("Wrote event " + i);

            // ... code that waits 1 second
            try {
              TimeUnit.MILLISECONDS.sleep(10);
            } catch (InterruptedException e) {
              Thread.currentThread().interrupt();
            }

          }
        } catch (IOException e) {
          System.out.println("Error when writing the event" + e);
          throw new RuntimeException("Error when writing the event.", e);
        } finally {
          try {
            eventOutput.close();
          } catch (IOException ioClose) {
            System.out.println("Error when closing the eventOuput" + ioClose);
            throw new RuntimeException("Error when closing the event output.", ioClose);
          }
        }
      }
    }).start();
    return eventOutput;
  }
}

Код клиента:

import org.glassfish.jersey.media.sse.EventInput;
import org.glassfish.jersey.media.sse.InboundEvent;
import org.glassfish.jersey.media.sse.SseFeature;
...
  public final void simpleClientTest() {
    final Client client = ClientBuilder.newBuilder().register(SseFeature.class).build();
    final WebTarget target = client.target("http://localhost:8182/events");

    final EventInput eventInput = target.request().get(EventInput.class);
    while (!eventInput.isClosed()) {
      final InboundEvent inboundEvent = eventInput.read();
      if (inboundEvent == null) {
        // connection has been closed
        break;
      }
      System.out.println(inboundEvent.getName() + "; " + inboundEvent.readData(String.class));
    }
    System.out.println("eventInput finished");
  }

person Ross A    schedule 03.05.2016    source источник


Ответы (1)


Я, наконец, нашел причину проблемы. Код запуска сервера (не приведенный выше) не включал ресурс SseFeature.class. В том числе здесь на случай, если у кого-то еще возникнет эта проблема....

  public void startServer() throws IOException {
    final URI baseUri = UriBuilder.fromUri("http://0.0.0.0").port(serverPort).build();
    System.out.println("Starting media server at: " + baseUri);
    final ResourceConfig config = new ResourceConfig(SseResource.class, SseFeature.class);
    server = GrizzlyHttpServerFactory.createHttpServer(baseUri, config);
  }
person Ross A    schedule 03.05.2016