如果vertx setPeriodic延迟小于其处理程序执行时间,将会发生什么

时间:2019-09-07 05:06:40

标签: java vert.x

在使用vertx.setPeriodic设置计时器的工作人员垂直环境中,假设延迟为100ms,但处理程序要花费5000ms,如果应用长时间运行,会发生什么情况时间。会导致内存泄漏问题吗?如果可以,该如何解决内存问题?

vertx.setPeriodic(100, timer -> {
    vertx.executeBlocking(future -> {
        // here are some blocking code may cause 5000ms to complete the future.
    }, res -> {
    });
})

1 个答案:

答案 0 :(得分:1)

最终是的,它将导致内存问题,因为

由于periodic内部的代码正在executeBlocking内部执行,因此它将在配置的工作池(具有固定大小)上执行,并且由于未指定order参数,因此每个executeBlocking调用将串行执行(即一个接一个)

由于periodic在事件循环线程上运行,因此它将永远不会等待,并且会在经过修复周期(在您的情况下为100毫秒)后继续触发。

因此,对周期内代码的调用将顺序执行并堆积起来。工作池耗尽后,对executeBlocking的调用将进入等待状态。

处理此问题的几种选择可以是(之一或组合)

  1. 具有单独的Worker顶点以用于周期。
  2. 通过专用于定期的名称定义单独的工作池。
  3. 根据运行定期作业所需的平均时间微调周期频率。
  4. 如果您不关心订购,可以调用executeBlocking,将false指定为ordered的参数。在这种情况下,任何executeBlocking都可以在工作池上并行执行。