本手册仍在编写中,目前尚未完善。
如果您想帮助改进它,我们希望您这样做,请参阅 README.

15 RxJava

优秀的 RxJava 可用于 Ratpack 应用程序优雅地组合异步操作。

ratpack-rx2 模块提供了 RxRatpack 类,它提供用于将 Ratpack 承诺转换为 RxJava 的 Observable 的静态方法。

截至 2.0.0-rc-1,ratpack-rx2 模块针对 (并依赖于) RxJava 2.2.21 构建。

1.15 初始化

必须调用 RxRatpack.initialize() 来完全启用集成。此方法仅需要在 JVM 的生命周期内调用一次。

2.15 观察 Ratpack

集成基于 RxRatpack.single()RxRatpack.observe() 静态方法。这些方法将 Ratpack 的承诺类型转换为可观察对象,然后可以使用 RxJava 提供的所有可观察操作符。

例如,阻塞操作可以轻松观察。

import ratpack.exec.Promise;
import ratpack.exec.Blocking;
import ratpack.test.handling.HandlingResult;

import static org.junit.jupiter.api.Assertions.assertEquals;
import static ratpack.rx2.RxRatpack.single;
import static ratpack.test.handling.RequestFixture.requestFixture;

public class Example {
  public static void main(String... args) throws Exception {
    HandlingResult result = requestFixture().handle(context -> {
      Promise<String> promise = Blocking.get(() -> "hello world");
      single(promise).map(String::toUpperCase).subscribe(context::render);
    });

    assertEquals("HELLO WORLD", result.rendered(String.class));
  }
}

3.15 隐式错误处理

RxJava 集成的关键特性是隐式错误处理。所有可观察序列都具有隐式默认错误处理策略,即转发异常到执行上下文错误处理程序。在实践中,这意味着错误处理程序很少需要为可观察序列定义。

import ratpack.core.error.ServerErrorHandler;
import ratpack.rx2.RxRatpack;
import ratpack.test.handling.RequestFixture;
import ratpack.test.handling.HandlingResult;
import io.reactivex.Observable;

import static org.junit.jupiter.api.Assertions.assertEquals;

public class Example {
  public static void main(String... args) throws Exception {
    RxRatpack.initialize(); // must be called once per JVM

    HandlingResult result = RequestFixture.requestFixture().handleChain(chain -> {
      chain.register(registry ->
          registry.add(ServerErrorHandler.class, (context, throwable) ->
              context.render("caught by error handler: " + throwable.getMessage())
          )
      );

      chain.get(ctx -> Observable.<String>error(new Exception("!")).subscribe((s) -> {}));
    });

    assertEquals("caught by error handler: !", result.rendered(String.class));
  }
}

在这种情况下,阻塞操作期间抛出的可抛出对象将被转发到当前的 ServerErrorHandler,该处理程序可能会将错误页面呈现到响应中。如果订阅者确实实现了错误处理策略,它将被用于取代隐式错误处理程序。

隐式错误处理适用于在 Ratpack 管理的线程上创建的所有可观察对象。它限于由 Ratpack 承诺支持的可观察对象。