如何包装在阿卡未来java.util.concurrent.Future?(How do I wra

2019-06-26 09:00发布

在播放框架2.0.1(斯卡拉)应用程序,我们使用它返回一个Web服务客户端库java.util.concurrent.Future作为回应。

相反,在阻断Play应用程式的get()调用,我们想包裹jucFutureakka.dispatch.Future ,这样我们就可以很容易地使用播放框架的AsyncResult处理。

有没有人这样做过,或有一个库或示例代码?


更新 :我们发现的最接近的是这个谷歌组的讨论: https://groups.google.com/forum/#!topic/play-framework/c4DOOtGF50c

...如果你已经是一个普通的jucFuture你可以创建一个非阻塞的解决方案,最好是采取jucFuture和承诺,并给他们一些线程运行的轮询循环,将完成与承诺的结果当它完成未来。

有没有人有这方面的一个例子实施?

Answer 1:

@Viktor巴生:据我们了解, jucFuture是可憎的。 但是,这就是我们从一个软件作为暂时给予我们必须接受找回。

到目前为止,这是我们已经一起黑客攻击:

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
}

换言之,创建一个单独的阿卡Promise (一个的写入侧Future对应于) jucFuture ,序幕回调pollJavaFutureUntilDoneOrCancelled通过轮询来更新无极“憎恶”,并返回无极给调用者。

那么,如何才能“民意调查”的基础上jucFuture的状态更新阿卡承诺?

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)
      }
    }
  }
}

这是在我的问题提到的谷歌组讨论什么暗示的尝试。 它采用了阿卡调度程序本身回电每50毫秒检查jucFuture要么完成或取消。 每当出现这种情况,它更新阿卡承诺与完成的状态。

@Victor巴生,等人:

这是最好的做法? 你知道一个更好的办法来做到这一点? 我们错过一个缺点在这里,我们应该知道的?

感谢您的任何更多的帮助。



Answer 2:

您应该使用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)

要点为完整的例子



文章来源: How do I wrap a java.util.concurrent.Future in an Akka Future?