我有一个桌面客户端和一个服务器端都用 Java 实现。服务器端位于 Tomcat 上。
现在我希望使用服务器发送事件进行检查,虽然 Tomcat 可以在服务器上使用它,但我不知道如何从它的客户端执行它。所有实现都使用 Javascript,如果您的客户端是 Javascript 客户端,这很好。我的不是。
所以,我的问题是——SSE 规范的客户端是否有任何 Java 实现?
我有一个桌面客户端和一个服务器端都用 Java 实现。服务器端位于 Tomcat 上。
现在我希望使用服务器发送事件进行检查,虽然 Tomcat 可以在服务器上使用它,但我不知道如何从它的客户端执行它。所有实现都使用 Javascript,如果您的客户端是 Javascript 客户端,这很好。我的不是。
所以,我的问题是——SSE 规范的客户端是否有任何 Java 实现?
我遇到了同样的问题并找到了解决方案。Jersey 有一个 SSE 客户端(它不是标准发行版的一部分,您还需要 jersey-media-sse jar,您可以在 Maven 存储库中找到它。
public static void consumeEventStream(String url, Consumer consumer) throws Exception {
Client client = ClientBuilder.newBuilder().register(new SseFeature()).build();
WebTarget target = client.target(url);
EventInput e = null;
while (true) {
Thread.sleep(1000);
if (e==null || e.isClosed()) {
// (re)connect
e = target.request().get(EventInput.class);
e.setChunkType("text/event-stream");
}
final InboundEvent inboundEvent = e.read();
if (inboundEvent == null) {
break;
}
else {
String data = inboundEvent.getData();
// do something here - notify observers, parse json etc
}
}
System.out.println("connection closed");
}
setChunkType 的调用是为了处理 Jersey 中的一个错误——如果 char 编码是内容类型的一部分,则 jersey 将无法识别事件类型。另一方面,规范和浏览器期望设置内容类型。会计。对 jira 来说,这已经解决了,但在最新版本的 jersey-media-sse-2.2.jar 中肯定还没有工作,另见https://java.net/jira/browse/JERSEY-2062。
希望这会有所帮助,詹斯