首页 > 解决方案 > Vert.x 请求处理程序和阻塞数据库查询

问题描述

如何在 vert.x 中正确翻译这段代码?

通常,在春天或在带有模板引擎的简单 sevlet 中输出 html 响应我会这样做

function test(request, response) {
  templatecontext tc = getContext();

  init conditions

  if (condition1) {
    retrieve data from db ({
      asyncresult -> {
        tc.put("data1", data1)
      })
  } else if (condition2) {
    other code

    if (condition 2.1) {        
      retrieve data from db ({
        asyncresult -> {
          tc.put("data2", data2)
        })
    }
  }

  get other data from db and put in context
  template.eval("templatefile", tc)
  write to response
}

问题是,从数据库中检索数据是 asyncresult 的处理程序,所以我不能允许使用 data1 或 data2 进行模板评估,因为在不陷入回调地狱的情况下检索异步。

我还没有真正理解 rxjava2,但我觉得我正试图用勺子杀死一颗豆子。

标签: javareactive-programmingrx-java2vert.x

解决方案


您可以使用futurescomposition。见ComposeExample回购vertx-examples

public class ComposeExample extends AbstractVerticle {    

  @Override
  public void start() throws Exception {
    Future<String> future = anAsyncAction();
    future.compose(this::anotherAsyncAction)
      .setHandler(ar -> {
        if (ar.failed()) {
          System.out.println("Something bad happened");
          ar.cause().printStackTrace();
        } else {
          System.out.println("Result: " + ar.result());
        }
      });
  }

  private Future<String> anAsyncAction() {
    Future<String> future = Future.future();
    // mimic something that take times
    vertx.setTimer(100, l -> future.complete("world"));
    return future;
  }

  private Future<String> anotherAsyncAction(String name) {
    Future<String> future = Future.future();
    // mimic something that take times
    vertx.setTimer(100, l -> future.complete("hello " + name));
    return future;
  }
}

推荐阅读