有没有办法将com.ning.http.client.ListenableFuture[A]类型的变量转换为scala.concurrent.Future[A]类型
换句话说,函数的内容是什么?
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不一样(因此这个提议的重复不能解决这个问题)
发布于 2016-06-03 17:04:47
这个想法和番石榴的ListenableFuture是一样的,尽管由于更多的限制签名而受到了更多的限制。
首先,您需要获得一个java.util.concurrent.Executor来添加回调。由于Scala代码与Java库交互,我建议基于Java定义您的scala.concurrent.ExecutorService池-这样您就可以同时保留执行器和ExecutorService的实例,如下所示:
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的一些异常语义):
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
}https://stackoverflow.com/questions/37617397
复制相似问题