在播放框架2.0.1(斯卡拉)应用程序,我们使用它返回一个Web服务客户端库java.util.concurrent.Future
作为回应。
相反,在阻断Play应用程式的get()
调用,我们想包裹jucFuture
在akka.dispatch.Future
,这样我们就可以很容易地使用播放框架的AsyncResult
处理。
有没有人这样做过,或有一个库或示例代码?
更新 :我们发现的最接近的是这个谷歌组的讨论: https://groups.google.com/forum/#!topic/play-framework/c4DOOtGF50c
...如果你已经是一个普通的jucFuture你可以创建一个非阻塞的解决方案,最好是采取jucFuture和承诺,并给他们一些线程运行的轮询循环,将完成与承诺的结果当它完成未来。
有没有人有这方面的一个例子实施?
@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巴生,等人:
这是最好的做法? 你知道一个更好的办法来做到这一点? 我们错过一个缺点在这里,我们应该知道的?
感谢您的任何更多的帮助。
您应该使用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)
要点为完整的例子