当前位置: 首页 > 知识库问答 >
问题:

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

谷星文
2023-03-14
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
    }
}
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
    }
}
  1. 是否应该将vertx执行上下文与verticles中的所有未来一起使用?
  2. 工人眩晕也有同样的问题。
  3. 如果以上问题的答案是肯定的,那么在vertx应用程序中,是否存在不应该使用vertx应用程序上下文的情况?

注意:我使用的是vertx 2.1.5和lang-scala 1.1.0。

共有1个答案

连志义
2023-03-14

我从Vert.x谷歌用户群的Lars Timm那里得到了一个答案:

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

顺便说一句,您应该考虑使用1.0.1-M1而不是1.1.0。据我所知,该版本的ExecutionContext中修复了一个错误。您也不必导入VertXExecutionContext。当您从Verticle/VertxAccess继承时,它将自动完成。

 类似资料:
  • 我有一个关于CompletableFuture方法的问题: JavaDoc的意思是: 返回一个新的完成阶段,当此阶段正常完成时,将使用此阶段的结果作为所提供函数的参数来执行该阶段。有关异常完成的规则,请参阅完成阶段文档。 穿线呢?这将在哪个线程中执行?如果未来由线程池来完成呢?

  • 我使用Spring Batch将表从源数据库克隆到目标数据库。使用和传递参数从服务层手动启动作业。 一切都很好,但是使用当前配置(下面),在步骤描述中使用时,我只克隆了10行,并且异常引起。

  • 问题内容: 这是我从这里看到的代码。我对关键字感到困惑。 对于,我需要? 对于,我需要? 问题答案: 无需在回调中使用return语句。Promise构造函数不期望回调返回任何类型的返回值。 因此,在该回调中使用语句的原因仅是为了控制该函数中的执行流程。 如果您希望回调内部的执行完成而又不执行该回调中的任何其他代码,则可以在此时发出a 。 例如,您可以这样编写代码,而无需声明: 在这种情况下,您使

  • 我对Maven还很陌生,不确定各个组件的正确角色。 我一直使用以下Maven-project结构来开发微服务: 那么,为什么父级中的插件要为每个子级执行,我如何防止这种情况呢?我仍然在项目的早期阶段,所以我可以重组模块结构,如果合适的话。 我尝试了https://stackoverflow.com/a/14653088/11249中建议的解决方案,但无法使其对我有效。

  • 问题内容: 看看这个: 我运行了一个快速的Google搜索,但找不到答案- 我应该用什么代替? 问题答案: 由于django 1.7 引入的迁移系统而被弃用。 现在,您可以使用 跟踪 更改。这会将您的模型更改转换为python代码,以使其可部署到另一个数据库。当您需要对数据库进行进一步的修改时,可以使用数据迁移。 创建迁移后,您必须 应用 它们:。 因此,除了使用之外,您还应该使用然后。 更改模型

  • 问题内容: 看看这个: 问题答案: 由于django 1.7引入的迁移系统而被弃用。 现在,你可以使用跟踪更改。这会将你的模型更改转换为python代码,以使其可部署到另一个数据库。当你需要对数据库进行进一步的修改时,可以使用数据迁移。 创建迁移后,你必须应用它们:。 因此,除了使用之外,你还应该使用然后。 更改模型中的某些内容后,开发工作流程如下: 在你的生产系统上: 奖励:你无需migrate