Vetx 应用程序中的正常关闭

问题描述 投票:0回答:1

缩小 Kubernetes pod 并没有优雅地关闭 Vertx 应用程序(用 java 开发)。它基本上杀死了容器。

重写了 io.vertx.core.Launcher 类的 beforeStoppingVertx 和 afterStoppingVertx 方法,并打印一些日志以验证 Vertx 是否正常关闭。 当 Pod 缩小时,方法 beforeStoppingVertx 和 afterStoppingVertx 永远不会被调用。

  @Override
  public void beforeStoppingVertx(Vertx vertx) {
    LOG.info("Vertx Closing Gracefully");
    vertx.close();
  }

  @Override
  public void afterStoppingVertx() {
    LOG.info("Vertx Closed Gracefully");
  }

尝试在部署 yml(这是通用模板)中添加 60 秒的宽限期,但仍然没有用(即使在 60 秒后也不会调用 beforeStoppingVertx 和 afterStoppingVertx 方法)

我怀疑 vert.x 永远不会被告知关闭。或者没有收到消息。 我们确实可以选择在 Kubernetes 中定义 Pre Stop 挂钩, https://kubernetes.io/docs/concepts/workloads/pods/pod-lifecycle/#pod-termination

问题是我们需要在 Pre-stop 挂钩中提及的实际脚本是什么,它会指示 Vert.x 正常关闭?

kubernetes vert.x kubernetes-pod application-shutdown graceful-shutdown
1个回答
0
投票

恕我直言,因为您使用的是自定义启动器类,所以 Kubernetes Vertx 甚至不会触发

vertx.close()

尝试在主方法末尾添加以下关闭挂钩:

public static void main(String[] args) {

    final Vertx vertx = Vertx.vertx();
    
    // deploy your verticles...

    Runtime.getRuntime().addShutdownHook(() -> {
        try {
          this.vertx.close()
            .toCompletionStage()
            .toCompletableFuture()
            .get(5, TimeUnit.SECONDS);

          log.info("<main> graceful shutdown success");
        } catch (Exception e) {
          log.error("<main> graceful shutdown error", e);
        }
    });
  }
© www.soinside.com 2019 - 2024. All rights reserved.