首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将`com.ning.http.client.ListenableFuture[Any]‘转换为’scala.concurrent.Future[Any]‘

将`com.ning.http.client.ListenableFuture[Any]‘转换为’scala.concurrent.Future[Any]‘
EN

Stack Overflow用户
提问于 2016-06-03 14:45:42
回答 1查看 382关注 0票数 0

有没有办法将com.ning.http.client.ListenableFuture[A]类型的变量转换为scala.concurrent.Future[A]类型

换句话说,函数的内容是什么?

代码语言:javascript
复制
def toFuture[A](a: com.ning.http.client.ListenableFuture[A]):scala.concurrent.Future[A] = ???

我特别是在A = com.ning.http.client.Response的情况下

请注意,com.ning.http.client.ListenableFuture[A]com.google.common.util.concurrent.ListenableFuture不一样(因此这个提议的重复不能解决这个问题)

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-06-03 17:04:47

这个想法和番石榴的ListenableFuture是一样的,尽管由于更多的限制签名而受到了更多的限制。

首先,您需要获得一个java.util.concurrent.Executor来添加回调。由于Scala代码与Java库交互,我建议基于Java定义您的scala.concurrent.ExecutorService池-这样您就可以同时保留执行器和ExecutorService的实例,如下所示:

代码语言:javascript
复制
import java.util.concurrent.Executors
import scala.concurrent.ExecutionContext
val executor = Executors.newFixedThreadPool(5) // use it for Java futures
implicit val executionContext = ExecutionContext.fromExecutor(executor) // use it for Scala futures

如果要处理不同池中的所有内容,则不需要上述步骤。如果您想使用现有的ExecutionContext,下面是我搜索的片段

然后,要将ListenableFuture转换为Future,我将执行如下操作(考虑到java.util.concurrent.Future的一些异常语义):

代码语言:javascript
复制
def toFuture[A](a: ListenableFuture[A]): Future[A] = {
  val promise = Promise[A]()
  a.addListener(new Runnable {
    def run() = {
      try {
        promise.success(a.get)
      } catch {
        case ex: ExecutionException => promise.failure(ex.getCause)
        case ex => promise.failure(ex)
      }
    }
  }, executor)
  promise.future
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37617397

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档