@Viktor Klang:それj.u.c.Future
は忌まわしいことだと理解しています。しかし、それは私たちが当分の間与えられたように受け入れなければならないソフトウェアの一部から私たちが取り戻しているものです。
これまでのところ、これは私たちが一緒にハッキングしたものです:
def wrapJavaFutureInAkkaFuture[T](javaFuture: java.util.concurrent.Future[T], maybeTimeout: Option[Duration] = None)(implicit system: ActorSystem): akka.dispatch.Future[T] = {
val promise = new akka.dispatch.DefaultPromise[T]
pollJavaFutureUntilDoneOrCancelled(javaFuture, promise, maybeTimeout.map(_.fromNow))
promise
}
つまり、に対応する別のAkka Promise
(の書き込み側)を作成し、「abomination」をポーリングしてPromiseを更新するためのコールバックを開始し、Promiseを呼び出し元に返します。Future
j.u.c.Future
pollJavaFutureUntilDoneOrCancelled
では、jucFutureの状態に基づいてAkkaPromiseを更新するにはどうすればよいでしょうか。
def pollJavaFutureUntilDoneOrCancelled[T](javaFuture: java.util.concurrent.Future[T], promise: akka.dispatch.Promise[T], maybeDeadline: Option[Deadline] = None)(implicit system: ActorSystem) {
if (maybeDeadline.exists(_.isOverdue)) javaFuture.cancel(true);
if (javaFuture.isDone || javaFuture.isCancelled) {
promise.complete(allCatch either { javaFuture.get })
} else {
Play.maybeApplication.foreach { implicit app =>
system.scheduler.scheduleOnce(50 milliseconds) {
pollJavaFutureUntilDoneOrCancelled(javaFuture, promise, maybeDeadline)
}
}
}
}
これは、質問で参照したgoogleグループのディスカッションで示唆されたものに対する試みです。Akkaスケジューラーを使用して、50ミリ秒ごとに自分自身をコールバックし、jucFutureが完了したかキャンセルされたかを確認します。それが発生するたびに、AkkaPromiseが完了状態で更新されます。
@Victor Klang、et al:
これはベストプラクティスですか?これを行うためのより良い方法を知っていますか?ここで知っておくべき欠点がありませんか?
これ以上の助けをありがとう。