如何异步处理SSE事件?

时间:2017-12-03 22:59:07

标签: java java-ee jax-rs server-sent-events java-ee-8

最理想的是,我希望能够做到这样的事情

Request request = new Request("http://someendpoint")
request.onMessage(payload -> System.out.println(payload))
request.onError(error -> error.printStackTrace())
request.onClose(() -> System.out.println("closed"))
request.onConnect(isReconnect -> System.out.println("connected"))

显然不一定要那样,只是认为这有助于解释我的目的。

我已经看到泽西岛有这种支持。我想找到一个替代方案,但如果没有别的东西可以使用它。

1 个答案:

答案 0 :(得分:2)

javax.ws.rs.sse包中的JavaEE 8到JAX-RS 2.1中提供了SSE。与可以同步或异步的请求和响应不同,SSE本质上是异步的。

有关SSE的演示,请查看David Delaba的<{3}} sse e。您的代码(仅限客户端)看起来像这样:

Client client = ClientBuilder.newClient();
WebTarget target = client.target("http://someendpoint");

SseEventSource eventSource = SseEventSource.target(target)
                                           .reconnectingEvery(5, TimeUnit.SECONDS)
                                           .build();
eventSource.register(payload -> System.out.println(payload),   // Consumer<InboundSseEvent>
                     error -> error.printStackTrace(),         // Consumer<Throwable>
                     () -> System.out.println("no more events"));
eventSource.open();
// and eventually
eventSource.close();

没有用于(重新)连接和关闭的内置处理程序,但您可以自定义某些内容以产生相同的效果。

JAX-RS 2.1在(至少)实现:

  • video 2.26,包含在Glassfish 5和Payara 5 alpha / snapshot / pre-release中。
  • Jersey 4.0.0.Beta1(不到一个月前发布)据报道可以在Wildfly 10及更高版本上工作,但我认为只有Wildfly 12才能实现完整的JavaEE 8(公告随时间变化)。 ..)。