26.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上に構築されたアプリケーションの場合は連鎖を使用します。
親トピック: グラフ・サーバー(PGX)での非同期リクエストの処理