如何从oncomplete success case返回值以便打印hello值?
目前,我成功地获得了具有正确值的查询响应,我可以在oncomplete success案例中处理它,以便打印正确的resp值。
import ing.wbaa.druid.SQLQuery
import scala.concurrent.ExecutionContext
import scala.util.{Failure, Success}
implicit val executionContext: ExecutionContext = ExecutionContext.Implicits.global
val query = SQLQuery(s"SELECT * FROM table1 WHERE col1 IN ('someString', 'someString2')")
val hello = executeQuery(query)
println(hello)
def executeQuery(foo: SQLQuery) = {
foo.execute.onComplete {
case Success(resp) => {
println(resp)
resp
}
case Failure(ex) => ex.printStackTrace()
}
}
原因是我可能有一个字符串列表而不是单个字符串,所以我想:
queryList = List("someString1", ..., "someStringN")
val splitted: List[List[String]] = queryList.grouped(1000).toList
val temp = splittedQueryList.par
temp.tasksupport = new ForkJoinTaskSupport(new ForkJoinPool(10))
val hello = temp.map(x => executeQuery(query, x)).seq
但是hello得到的不是值而是()。
你可能还会问我为什么要从一个完整的地方回来?因为我想用收到的响应构建sparkDataframe。
1条答案
按热度按时间qcbq4gxm1#
这是因为
onComplete
有Unit
返回类型,在其签名处获取战利品:目的
onComplete
是为添加回调success
以及failure
分支机构Future
评价。这个onComplete
目的不是为了让未来的成功价值成为自己的东西,更多的是在结果类型(不是价值)的情况下添加一些处理:Success
或者Failure
.map
函数更适合你的使用目的,一些成功的结果来自Future
. 它会将结果值更改为您需要的值,而不会丢失异步性。在斯卡拉,Future
通常用于异步处理,最终结果通常是使用所以,如果您想处理对数据库的一系列查询,请按顺序处理它们并获得一系列结果。这种技术被称为未来合成。
我想建议你更好的方法:
使用
map
中的函数Future
例如,将查询到db的某些结果Map到您期望的类型。改变executeQuery
返回的签名Future[ResultType]
包裹temp.map(x => executeQuery(query, x))
由Future.sequence
函数按顺序进行查询和转换Seq[Future[ResultType]]
至Future[Seq[ResultType]]
.过程
Future[Seq[ResultType]]
使用map
函数也可以得到最终结果YourResultTypeProcessingType
.您的代码应如下所示:
了解scala未来的有用链接:
scala未来概述
期货组合,自由代码阵营