14

java.util.concurrent.FuturePlay Framework 2.0.1(Scala)アプリケーションでは、応答として返されるWebサービスクライアントライブラリを使用しています。

呼び出し時にPlayアプリをブロックするのではなく、get()をラップしてj.u.c.Futureakka.dispatch.FuturePlayFrameworkの処理を簡単に使用できるようにしますAsyncResult

誰かが以前にこれを行ったことがありますか、またはライブラリまたはサンプルコードを持っていますか?


更新:私たちが見つけた最も近いものは、このグーグルグループの議論です:https ://groups.google.com/forum/#!topic / play-framework / c4DOOtGF50c

...もしあなたが持っているのがプレーンなjucFutureだけなら、ノンブロッキングソリューションを作成するためにできる最善のことは、jucFutureとPromiseを取り、それらをポーリングループを実行しているスレッドに渡して、Promiseを次の結果で完成させることです。それが行われるときの未来。

誰かがこれの実装例を持っていますか?

4

2 に答える 2

7

@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を呼び出し元に返します。Futurej.u.c.FuturepollJavaFutureUntilDoneOrCancelled

では、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:

これはベストプラクティスですか?これを行うためのより良い方法を知っていますか?ここで知っておくべき欠点がありませんか?

これ以上の助けをありがとう。

于 2012-07-18T21:17:07.460 に答える
0

akka.dispatch.Futures.future()で使用する必要がありますjava.util.concurrent.Callable

val akkaFuture: akka.dispatch.Future[String] = akka.dispatch.Futures.future(
  new java.util.concurrent.Callable[String] {
    def call: String = {
      return "scala->" + javaFuture.get
    }
}, executionContext)

完全な例の要点

于 2013-06-26T12:26:53.903 に答える