Java API for RESTful Web Services JAX-RS 2.1 于本周发布。据 Oracle 技术小组首席成员及 JSR 规范牵头人 Santiago Pericas-Geertsen 介绍,JAX-RS 2.1 中包括对服务器发送事件(SSE,Server-Sent Event)和 JSON-B 的支持,并改进了对 JSON-P 的支持。该 API 给出了对客户端 API 的响应式扩展,内建了对 Java 8 CompletionStage 的支持,以及对 RxJava 等其它响应式 API 的扩展点。
参考 JAX-RS 2.1 规范,这次发布版本的目标包括用于 POJO 的注解(Annotation)以及可灵活使用的 API,这些 API 提供了对通用 HTTP 使用模式和 WebDAV 、 Atom Publishing Protocol 等应用的高层支持,支持多种 HTTP 实体内容类型、Servlet 容器和 JAX-WS 提供者,并将提供 Web 资源类中对 Java EE 特性和组件的支持。
在 InfoQ 对 Pericas-Geertsen 的采访中,他详细介绍了 SSE:
SSE 资源中注入了一种称为 SseEventSink 的特定类型,提供文本流和事件流。SSE 客户使用 SseEventSource 从连接中读取事件。
该机制使用了长连接和广播,提供的性能要比轮询和资源密集短连接更优。
下面的代码段展示了 SSE 的用法:
服务器端:
@GET @Produces(MediaType.SERVER_SENT_EVENTS) public void getMessageQueue(@Context Sse sse, @Context SseEventSink eventSink) { // 一旦客户订购事件流,就激活资源方法。 // 这意味着事件更像是从不同的场景中发出,例如线程、事件处理器等。 // 资源方法通常实现为存储 eventSink 实例,应用逻辑将在事件应被发送到客户时检索事件。 // 发送事件: eventSink.send(sse.newEvent("event1")); }
客户端:
WebTarget target = ClientBuilder.newClient().target("server-sent-events"); SseEventSource eventSource = SseEventSource.target(target).build(); // EventSource#register(Consumer<inboundsseevent>) // 经注册的事件处理器将打印出所接收到的消息。 eventSource.register(System.out::println); // 向事件流订阅。 eventSource.open(); </inboundsseevent>
Pericas-Geertsen 补充了一下几点:
- JAX-RS 2.1 完全向后兼容前期版本。
- 新特性很好地集成了现有的 JAX-RS 概念。例如,仅需在客户调用中注入一个方法调用,就可以将处理方式由同步转向响应式。
- SSE 依赖基于流 HTTP 的连接,是现有 API 的自然扩展。
鉴于该 API 广泛地使用了注解机制和 Lambda 表达式,因此它支持 Java SE 8 及以后版本所开发的应用。
评论