Java ライブラリの小さなスカラ ラッパーを作成中です。
Java ライブラリには、2 つのメソッドを公開するオブジェクト QueryExecutor があります。
- 実行 (クエリ): 結果
- asyncExecute(クエリ): ListenableFuture[結果]
このコンテキストでの ListenableFuture は、guava ライブラリのものです。
Scala ラッパーが Java オブジェクトではなく Future[Result] を返すようにしたいのですが、それを実装する最善の方法がわかりません。私が思いついた2つの解決策は次のとおりです。
future {
executor.execute(query)
}
と
val p = promise[Result]
val guavaFuture = executor.asyncExecute(query)
Futures.addCallback(guavaFuture, new FutureCallback[Result] {
def onFailure(t: Throwable) {
p.failure(t)
}
def onSuccess(result: Result) {
p.success(result)
}
})
p.future
どの方法がベストなのか悩んでいます。私の直感では、最初のものは Future を返しますが、execute の呼び出しが応答を待っている間もスレッドをブロックし、2 番目のものは実際には非ブロックであるように見えます。各方法の長所/短所について何かコメントはありますか?