ms-*_*-tg 14 scala future akka playframework-2.0
在Play Framework 2.0.1(Scala)应用程序中,我们使用的Web服务客户端库java.util.concurrent.Future作为响应返回.
get()我们不想在调用中阻止Play应用程序,而是将其包装成j.u.c.Future一个akka.dispatch.Future,以便我们可以轻松地使用play框架的AsyncResult处理.
有没有人以前做过这个,或者有一个库或示例代码?
更新:我们发现的最接近的是谷歌小组讨论:https://groups.google.com/forum/#!topic / play-frame/c4DOOtGF50c
...如果您拥有的只是一个简单的jucFuture,那么创建非阻塞解决方案的最佳方法是使用jucFuture和Promise,并将它们提供给运行轮询循环的某个线程,该循环将完成Promise的结果完成后的未来.
有没有人有这个例子的实现?
@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
}
Run Code Online (Sandbox Code Playgroud)
换句话说,创建一个单独的Akka Promise(a的写入端Future)对应于j.u.c.Future,pollJavaFutureUntilDoneOrCancelled通过轮询"abomination"来启动回调以更新Promise,并将Promise返回给调用者.
那么我们如何根据jucFuture的状态"轮询"更新Akka Promise?
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)
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在问题中引用的Google小组讨论中所暗示的尝试.它使用Akka调度程序每50毫秒调用一次自己来检查jucFuture是否已完成或取消.每当发生这种情况时,它会以完成状态更新Akka Promise.
@Victor Klang,等人:
这是最佳做法吗?你知道更好的方法吗?我们在这里错过了一个我们应该知道的缺点吗?
感谢您提供更多帮助.
| 归档时间: |
|
| 查看次数: |
8026 次 |
| 最近记录: |