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