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

标签 java vert.x

在使用 vertx.setPeriodic 设置计时器的工作 verticle 中,假设延迟为 100ms,但处理程序需要 5000ms 才能完成,如果应用程序运行很长时间会发生什么。会导致内存泄漏问题吗?如果是这样,如何解决内存问题?

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

最佳答案

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

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

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

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

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

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

关于java - 如果 vertx setPeriodic 延迟小于其处理程序执行时间会发生什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57830841/

相关文章:

java - 运行GUI程序时如何改变标题栏的颜色?

java - 如果 Kafka 节点出现故障,则发出警报

java - vert.x 响应式(Reactive) mySQL 客户端查询总是给出空结果

java - 为什么在vertx的Handlebars库中调用Synchronize?

java - 在 GUI 中显示一些可选择的字符串

java - 将 StringArray 的值从 java 类打印到 JSP 中

java - 无法在我的车辆交易程序中销售卡车和 1 个 JUnit 错误(缺少抽象方法)

kotlin - 找到Kotlin Vertx类型不匹配Future <Unit>预期的Handler <AsyncResult <Void >>

java - 我可以在 Vert.x HTTP 请求队列上设置容量吗?

java - 证书链验证