在垂直场景中,我应该使用vertx ExecutionContext来执行Scala future的完成吗?

在垂直场景中,我应该使用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("/

为了摆脱嵌套回调的地狱,至少为了可读性,我在vertx应用程序中使用Scala futures

我有一个简单的verticle来处理HTTP请求。在收到请求后,verticle调用一个方法来执行异步操作并返回Future。在将来完成时,HTTP响应将发送到客户端:

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

请注意,这是一个最小的示例。在我的实际应用程序代码中,我有多个嵌套回调,因此链接未来

我的问题是:

  • 我应该在verticles中使用vertx执行上下文吗
  • 同样的问题也适用于工人
  • 如果以上问题的答案是肯定的,那么在vertx应用程序中,我是否不应该使用vertx应用程序上下文
  • 注意:我使用的是带有lang scala 1.0.0的vertx 2.1.5。

    我从Lars Timm那里得到了vert.x Google用户组的一个信息:

    是的,您应该使用特定于Vertx的执行上下文。这确保了未来在正确的线程/事件循环上运行。我还没有试过工人的竖直,但我不明白为什么它不应该在那里也工作

    顺便说一下,你应该考虑使用1.0.1-M1而不是1.0.0。据我记忆所及,在那个版本的ExecutionContext中修复了一个错误。 您也不必导入VertexcutionContext。当您从Verticle/VertxAccess继承时,它会自动完成