Как я могу асинхронно обрабатывать события SSE?
Оптимально, я хотел бы иметь возможность сделать что-то вроде этого
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 ответ
SSE доступны в JavaEE 8 - JAX-RS 2.1 в пакете javax.ws.rs.sse. В отличие от запросов и ответов, которые могут быть синхронными или асинхронными, SSE по своей природе являются асинхронными.
Для демонстрации SSE посмотрите это видео от David Delabasse 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 реализован в (как минимум):
- Джерси 2.26, который входит в состав Glassfish 5 и Payara 5 alpha / snapshot / pre-release.
- RESTEasy 4.0.0.Beta1 (выпущен менее месяца назад) и, как сообщается, работает на Wildfly 10 и выше, хотя я думаю, что только Wildfly 12 будет реализовывать полную JavaEE 8 (объявления меняются со временем...).