我们如何将Java中的反应性JDBC调用转换为Scala中的Future?

问题描述 投票:1回答:1

此处查看示例:https://github.com/vietj/reactive-pg-client

// Pool options
PgPoolOptions options = new PgPoolOptions()
  .setPort(5432)
  .setHost("the-host")
  .setDatabase("the-db")
  .setUser("user")
  .setPassword("secret")
  .setMaxSize(5);

// Create the client pool
PgPool client = PgClient.pool(options);

// A simple query
client.query("SELECT * FROM users WHERE id='julien'", ar -> {
  if (ar.succeeded()) {
    PgResult<Row> result = ar.result();
    System.out.println("Got " + result.size() + " results ");
  } else {
    System.out.println("Failure: " + ar.cause().getMessage());
  }

  // Now close the pool
  client.close();
});

如何从中获得未来?理想情况下,我们可以按照以下方式编写代码:

val f: Future[...] = clientF.query("select ...")
scala jdbc future reactive
1个回答
0
投票

您可以尝试使用Promise:

def fetch(query: String): Future[PgRowSet] = {

  val options = new PgPoolOptions()
      .setPort(5432)
      .setHost("the-host")
      .setDatabase("the-db")
      .setUser("user")
      .setPassword("secret")
      .setMaxSize(5)

  val client = PgClient.pool(options)

  val p = Promise[PgRowSet]()

  client.query(query, ar => {
      if (ar.succeeded) {
        p.success(ar.result()) //resolve promise as sucessful
      } else {
        p.failure(ar.cause()) //reject promise
      }
      client.close
  })

  p.future
}
© www.soinside.com 2019 - 2024. All rights reserved.