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.FlowableProviderFlowable 提供这种机制。

这意味着,在服务器端,您可以通过为流或 AsyncResponse Provider 接口声明对流或 AsyncResponseProvider 接口的 @ Provider 注释来添加对其他被动类型的支持。这两个接口都有一个方法,可将新的被动类型分别转换为 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);
}
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

© 2024 Red Hat, Inc.