15.3. Jersey Server-Sent Events API

本章简要描述了 Jersey 如何支持 SSE。细节和示例将在下面章节中描述。

Jersey 都包含支持 服务器和客户端的 SSE。SSE 在 Jersey 被实现为一个扩展支持一个新的媒体类型,这意味着 SSE 真的仅视为另一种媒体类型,可以从资源方法返回并客户端处理。只有最小的额外支持“分块”消息添加到Jersey ,因此不能作为标准 JAX-RS 实现媒体类型的扩展。

为使用 Jersey SSE, 添加如下依赖:

Example 15.1. Add jersey-media-sse dependency.

  1. <dependency>
  2. <groupId>org.glassfish.jersey.media</groupId>
  3. <artifactId>jersey-media-sse</artifactId>
  4. </dependency>

注意

Jersey 2.8 之前,您必须手动注册 SseFeature 在您的应用程序。(SseFeature 功能,既可以注册在客户端和服务器)。Jersey 2.8 以来,这个功能会自动发现和注册,当 Jersey SSE 模块放在应用程序的类路径中。禁用 SSE 的自动发现和注册功能可以通过 DISABLE_SSE 属性设置为 true 实现。该行为也可以选择性地通过在客户机或服务器运行时通过设置 DISABLE_SSE_CLIENTDISABLE_SSE_SERVER 属性来分别实现禁用。

SseFeature 添加新支持的实体(代表) Java 类型,即 OutboundEvent 用于出站服务器事件和 InboundEvent 用于为入站客户端端事件。这些类型是由 OutboundEventWriter 和 InboundEventReader 来进行序列化和反序列化。单独的事件消息媒体类型是没有限制的;SSE 流使用的媒体类型作为整体“text/event-stream”,这媒体类型应设置在消息用于服务 SSE 事件(例如在服务器端使用 @Produces 方法返回一个EventOutput —见下文)。InboundEvent 和 OutboundEvent 包含所需的组合和处理独立 SSE 事件的所有字段。这些实体代表了块通过一个开放的服务器到客户端连接来发送或接收,由一个服务器端的 ChunkedOutput 和客户端的 ChunkedInput来展示(如果你不熟悉 ChunkedOutput 和 ChunkedInput,看到更多细节的异步第一章)。换句话说,我们的资源方法,用于打开一个SSE 连接到客户端,不会返回独立的 OutboundEvents。相反,返回一个新的 EventOutput 实例。EventOutput 是一个类型的扩展 ChunkedOutput<OutboundEvent >。同样,在客户端,接收 InboundEvents ,Jersey SSE API提供了一个EventInput,代表一个类型的扩展 ChunkedInput<InboundEvent>

Jersey 服务器 SSE API 还包含一个 SseBroadcaster 功能,这提供了一个方便的方法,可以对多个 EventOutput 实例进行分组,并公开广播新事件的方法,对所有的客户端连接进行分组广播。SseBroadcaster 继承自Broadcaster ,这是通用的广播分块消息处理功能的实现。在客户端,Jersey SSE API包含额外的 EventSource 和 EventListener 类,进一步提高方便处理新的入站 SSE事件。