scala – 如何在Akka Future中包装java.util.concurrent.Future
在Play Framework 2.0.1(
Scala)应用程序中,我们使用一个Web服务客户端库,它返回java.util.concurrent.Future作为响应.
而不是阻止Play()调用的Play应用程序,我们希望将j.u.c.Future包装在一个akka.dispatch.Future中,以便我们可以轻松地使用play框架的AsyncResult处理. 有人以前做过这样的事情,还是有图书馆或者示例代码? 更新:我们发现最接近的是这个谷歌组讨论:https://groups.google.com/forum/#!topic/play-framework/c4DOOtGF50c
有人有这个例子吗? 解决方法
@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 } 换句话说,创建一个对应于j.??u.c.Future的单独的Akka Promise(未来的写入方),启动回调pollJavaFutureUntilDoneOrCancelled,通过轮询“可憎”来更新承诺,并将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,maybeDeadline) } } } } 这是我在这个问题中引用的Google群组讨论中暗示的内容.它使用Akka调度程序每50ms调用一次自己来检查j.u.c.Future是完成还是取消.每当发生这种情况时,它将以完成的状态更新Akka Promise. @Victor Klang,et al: 这是最好的做法吗你知道一个更好的方法吗?我们在这里错过了我们应该知道的缺点吗? 感谢任何更多的帮助. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |