15.3.2 連鎖操作

インメモリー・グラフ・サーバー(PGX)には、Futureインタフェースの単調な拡張であるPgxFutureという名前のJava 8のCompletableFutureバージョンが出荷されます。

CompletableFutureを使用すると、ポーリングなし、かつ深くネストされたコールバック(コールバック地獄とも呼ばれる)の必要なく、非同期計算を連鎖させることができます。PGX APIによって返されるすべてのPgxFutureインスタンスは、CompletableFutureのインスタンスとなり、Java 8の必要なく連鎖させることができます。

import java.util.concurrent.CompletableFuture

...

final GraphConfig graphConfig = ...
instance.createSessionAsync("my-session")
  .thenCompose(new Fun<PgxSession, CompletableFuture<PgxGraph>>() {
  @Override
  public CompletableFuture<PgxGraph> apply(PgxSession session) {
    return session.readGraphWithPropertiesAsync(graphConfig);
  }
}).thenAccept(new Action<PgxGraph>() {
  @Override
  public void accept(PgxGraph graph) {
    // do something with loaded graph
  }
});
前述の例の非同期連鎖の説明を次に示します。
  • コードの最初の行によって、createSessionAsync()に対する非同期コールが実行され、セッションが作成されます。

    promiseが解決されると、新しく作成されたPgxSessionであるPgxFutureオブジェクトが返されます。

  • 次に、PgxSessionオブジェクトを引数として使用する関数を渡すことによって、.thenCompose()ハンドラをコールします。

    関数内には、別のPgxFutureオブジェクトを返す別のreadGraphWithPropertiesAsync()非同期リクエストがあります。

    .thenCompose()によって返された外側のPgxFutureオブジェクトは、readGraphWithPropertiesAsync()リクエストが完了すると解決されます。

  • その後に.thenAccept()ハンドラが続きます。.thenAccept()に渡される関数は何も返しません。したがって、.thenAccept()future戻り型はPgxFuture<Void>になります。

ブロックと連鎖

ほとんどのユースケースでは、コール元のスレッドをブロックできます。ただし、ブロックを使用した場合、処理がより複雑になったときにすぐにパフォーマンスの低下やデッドロックにつながる可能性があります。原則として、シェル・スクリプト内や対話型PGXシェルを使用した対話形式の分析中など、選択したグラフを順番にすばやく分析する場合はブロックを使用します。

PGX上に構築されたアプリケーションの場合は連鎖を使用します。