加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-16 09:13:47 所属栏目:安全 来源:网络整理
导读:在Play Framework 2.0.1( Scala)应用程序中,我们使用一个Web服务客户端库,它返回java.util.concurrent.Future作为响应. 而不是阻止Play()调用的Play应用程序,我们希望将j.u.c.Future包装在一个akka.dispatch.Future中,以便我们可以轻松地使用play框架的Async
在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

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

换句话说,创建一个对应于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:

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

感谢任何更多的帮助.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读