gpt4 book ai didi

scala - 如何在 Akka Future 中包装 java.util.concurrent.Future?

转载 作者:行者123 更新时间:2023-12-03 22:36:52 24 4
gpt4 key购买 nike

在 Play Framework 2.0.1 (Scala) 应用程序中,我们使用了返回 java.util.concurrent.Future 的 Web 服务客户端库。作为回应。

而不是在 get() 上阻止​​ Play 应用程序打电话,我们想包装 j.u.c.Futureakka.dispatch.Future ,让我们可以方便的使用play框架的AsyncResult加工。

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

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

...if all you have is a plain j.u.c.Future the best you can do to create a non blocking solution is to take the j.u.c.Future and a Promise, and give them to some thread running a polling loop that will complete the Promise with the result of the Future when it is done.



有没有人有这个的示例实现?

最佳答案

@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 ( Future 的写端)对应于 j.u.c.Future , 开始回调 pollJavaFutureUntilDoneOrCancelled通过轮询“abomination”来更新 Promise,并将 Promise 返回给调用者。

那么我们如何根据 j.u.c.Future 的状态“轮询”更新 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)
}
}
}
}

这是对我在问题中引用的谷歌小组讨论中暗示的内容的尝试。它使用 Akka 调度程序每 50 毫秒回调一次,以检查 j.u.c.Future 是完成还是取消。每当发生这种情况时,它都会使用已完成状态更新 Akka Promise。

@Victor Klang 等人:

这是最佳做法吗?你知道一个更好的方法来做到这一点吗?我们是否错过了一个我们应该知道的缺点?

感谢您提供更多帮助。

关于scala - 如何在 Akka Future 中包装 java.util.concurrent.Future?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11529145/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com