在垂直场景中,我应该使用vertx ExecutionContext来执行Scala future的完成吗?
为了摆脱嵌套回调的地狱,至少为了可读性,我在vertx应用程序中使用Scala futures 我有一个简单的verticle来处理HTTP请求。在收到请求后,verticle调用一个方法来执行异步操作并返回Future。在将来完成时,HTTP响应将发送到客户端:在垂直场景中,我应该使用vertx ExecutionContext来执行Scala future的完成吗?,scala,vert.x,Scala,Vert.x,为了摆脱嵌套回调的地狱,至少为了可读性,我在vertx应用程序中使用Scala futures 我有一个简单的verticle来处理HTTP请求。在收到请求后,verticle调用一个方法来执行异步操作并返回Future。在将来完成时,HTTP响应将发送到客户端: class HttpVerticle extends Verticle with VertxAccess { val routeMatcher = RouteMatcher() routeMatcher.get("/
class HttpVerticle extends Verticle with VertxAccess {
val routeMatcher = RouteMatcher()
routeMatcher.get("/test", request => {
println(Thread.currentThread().getName)
// Using scala default ExecutionContext
import scala.concurrent.ExecutionContext.Implicits.global
val future = getTestFilePath()
future.onComplete {
case Success(filename) => {
println(Thread.currentThread().getName)
request.response().sendFile(filename)
}
case Failure(_) => request.response().sendFile("/default.txt")
}
})
def getTestFilePath(): Future[String] = {
// Some async stuff returning a Future
}
}
我注意到,使用通常的(至少对我来说)ExecutionContext,执行未来完成的线程不是vertx池的一部分(这就是prinln语句的用途)。第一个prinln输出vert.x-eventloop-thread-4
,而第二个prinln输出ForkJoinPool-1-worker-5
然后,我想我必须使用vertx执行上下文:
class HttpVerticle extends Verticle with VertxAccess {
val routeMatcher = RouteMatcher()
routeMatcher.get("/test", request => {
println(Thread.currentThread().getName)
// Using vertx execution context
implicit val ec: ExecutionContext = VertxExecutionContext.fromVertxAccess(this)
val future = getTestFilePath()
future.onComplete {
case Success(filename) => {
println(Thread.currentThread().getName)
request.response().sendFile(filename)
}
case Failure(_) => request.response().sendFile("/default.txt")
}
})
def getTestFilePath(): Future[String] = {
// Some async stuff returning a Future
}
}
这样,第一个和第二个println将输出vert.x-eventloop-thread-4
请注意,这是一个最小的示例。在我的实际应用程序代码中,我有多个嵌套回调,因此链接未来
我的问题是: