在Verticle中,我应该使用vertx ExecutionContext来执行Scala未来的完成吗?

时间:2015-05-19 15:23:23

标签: scala vert.x

试图摆脱嵌套回调地狱,至少为了便于阅读,我在我的vertx应用程序中使用Scala期货。

我有一个处理HTTP请求的简单Verticle。收到请求后,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,而第二个输出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

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

我的问题是:

  1. 我应该使用vertx执行上下文和Verticle中的所有未来吗?
  2. 工作人员 Verticle的相同问题。
  3. 如果上述问题的答案是肯定的,是否有一种情况,在vertx应用程序中,我不应该使用vertx应用程序上下文?
  4. 注意:我使用的是带有lang-scala 1.0.0的vertx 2.1.5。

1 个答案:

答案 0 :(得分:1)

我在vert.x Google用户组中获得了Lars Timm的answer

  

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

     

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