2.21.2. 其他活跃类的扩展
RESTEasy 实施框架,支持其他被动类的扩展。在服务器端,当资源方法返回 CompletionStage
类型时,RESTEasy 会使用 org.jboss.resteasy.core.AsyncResponseConsumer
类订阅它。当 CompletionStage
完成后,它会调用 CompletionStageResponseConsumer.accept()
,它会将结果发回到客户端。
RESTEasy 内置了对 CompletionStage
的支持。我们可以通过提供一种将单机转换为完成阶段的机制,将支持扩展到 单
类
。
在 resteasy-rxjava2
模块中,org.jboss.resteasy.rxjava2.SingleProvider
实施 org.jboss.resteasy.spi.AsyncResponseProvider<Single<?>>
接口提供此机制:
public interface AsyncResponseProvider<T> { public CompletionStage toCompletionStage(T asyncResponse); }
假定为 SingleProvider
类,RESTEasy 可以单选一个 单
级,将它转换为 CompletionStage
ResponseConsumer,然后使用 CompletionStageResponseConsumer
来处理 单
台最终值。类似地,当资源方法返回流的被动类(如 Flowable
)时,RESTEasy 订阅它,接收数据元素流并将其发送到客户端。AsyncResponseConsumer
具有多个支持类,各自实施不同的流模式。
例如,AsyncResponseConsumer.Async GeneralStreamingSseResponseConsumer
处理常规流和 SSE 流。订阅通过调用 org.reactivestreams.Publisher.subscribe()
完成,因此需要一种机制来 将流向
发布
程序,例如:也就是说,调用 org.jboss.resteasy.spi.AsyncStreamProvider<Flowable>
的实现,其定义 AsyncStreamProvider
,如下例所示:
public interface AsyncStreamProvider<T> { public Publisher toAsyncStream(T asyncResponse); }
在 resteasy-rxjava2
模块中,org.jboss.resteasy.FlowableProvider
为 Flowable
提供这种机制。
这意味着,在服务器端,您可以通过为流或 AsyncResponse Provider 接口声明对流或
注释来添加对其他被动类型的支持。这两个接口都有一个方法,可将新的被动类型分别转换为
ProviderAsyncResponseProvider
接口的 @Publisher 或
CompletionStage
(流)或单个值。
在客户端,JAX-RS 2.1 提出了支持被动类的两个要求:
-
支持
CompletionStage
作为javax.ws.rs.client.CompletionStageRxInvoker
接口的实施。 - 支持注册实施的供应商的可扩展性:
public interface RxInvokerProvider<T extends RxInvoker> { public boolean isProviderFor(Class<T> clazz); public T getRxInvoker(SyncInvoker syncInvoker, ExecutorService executorService); }
注册 RxInvokerProvider 后,您可以通过调用 javax.ws.rs.client.Invocation.Builder
方法来请求 RxInvoker:
public <T extends RxInvoker> T rx(Class<T> clazz);
您可以使用 RxInvoker 进行调用,以返回适当的被动类。例如:
FlowableRxInvoker invoker = client.target(generateURL("/get/string")).request().rx(FlowableRxInvoker.class); Flowable<String> flowable = (Flowable<String>) invoker.get();
RESTEasy 为实施 RxInvokers
提供部分支持。例如,上面提到的 SingleProvider
还实施了 org.jboss.resteasy.spi.AsyncClientResponseProvider<Single<?>>
,其中 AsyncClientResponseProvider
定义为以下内容:
public interface AsyncClientResponseProvider<T> { public T fromCompletionStage(CompletionStage<?> completionStage); }