如何异步处理 SSE 事件?
How can I asynchronously handle SSE events?
理想情况下,我希望能够做这样的事情
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"))
显然不必完全像那样,只是认为这有助于解释我正在尝试做的事情。
我看到泽西岛对此有某种支持。我想找到一个替代方案,但如果没有其他选择,我会使用它。
SSE 在 JavaEE 8 到 javax.ws.rs.sse 包中的 JAX-RS 2.1 中可用。与同步或异步的请求和响应不同,SSE 本质上是异步的。
要了解 SSE 的演示,请查看 David Delabassee 的 video。您的代码(仅在客户端)看起来像这样:
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 实现(至少):
理想情况下,我希望能够做这样的事情
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"))
显然不必完全像那样,只是认为这有助于解释我正在尝试做的事情。
我看到泽西岛对此有某种支持。我想找到一个替代方案,但如果没有其他选择,我会使用它。
SSE 在 JavaEE 8 到 javax.ws.rs.sse 包中的 JAX-RS 2.1 中可用。与同步或异步的请求和响应不同,SSE 本质上是异步的。
要了解 SSE 的演示,请查看 David Delabassee 的 video。您的代码(仅在客户端)看起来像这样:
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 实现(至少):