Play2 (Java を使用) を使用して、かなり計算コストの高い操作を実行する Web サービスを作成しています。ドキュメントに従って、プロセスを次のような一連の約束に分割しました。
// Do some IO stuff on a background thread
Promise<ExtractionResult> extractDataPromise = Akka.future(new Callable<ExtractionResult>(){
@Override
public ExtractionResult call() throws Exception {
return null;
}
});
// Perform a couple computations based on the result
Promise<MyResult> longRunningComputation1 = extractDataPromise.map(
new Function<ExtractionResult, MyResult>(){
public MyResult apply(ExtractionResult er){
return longRunningComputation();
}
}
)
Promise<MyResult> longRunningComputation2 = extractDataPromise.map(
new Function<ExtractionResult, Result>(){
public Result apply(ExtractionResult er){
return longRunningComputation();
}
}
)
// Synchronize back up to make the result
Promise.sequence(longRunningComputation1, longRunningComputation2).flatMap(
// Do something with the results
)
ドキュメントで読んだことによると、アクターの実行中に中断することはできません。つまり、IO の実行中または longRunningComputation の途中で上記のチェーンをキャンセルできませんでした。連鎖呼び出しの間の操作全体をキャンセルすることは可能でしょうか? つまり、ユーザーがキャンセル リクエストを行った場合、操作が基本的にノーオペレーションになり、null の結果を返すようにチェックできるフラグを設定できますか? 長時間実行されているサービス リクエストをキャンセルする別の推奨される方法はありますか?
私は Play と基礎となる Akka フレームワークの両方にかなり慣れていないので、提案をお待ちしています。ありがとう