gpt4 book ai didi

java - SparkJava的awaitStop()方法立即返回,即使在初始化之后也是如此,但stop()尚未被调用

转载 作者:行者123 更新时间:2023-12-01 18:11:46 25 4
gpt4 key购买 nike

我有一个使用 SparkJava 2.9.1 构建的小型 REST 服务,其中包含一个用于更改服务的绑定(bind) IP 地址和端口的 API。如果这些设置发生更改,我想停止当前服务并使用新值重新启动它,而不退出 JVM。

我执行此操作的基本流程是:

  1. 启动服务。
  2. 调用awaitInitialation()(因为我不想在其初始化之前调用awaitStop())。
  3. 调用awaitStop()并等待当前服务完成。
  4. 从新参数开始。

我使用实例接口(interface)来执行此操作,因为我有两个服务,一个基于 HTTP,另一个基于 HTTPS。

其精简版本(无需实际重新启动)如下所示:

public class SparkTest {
public static void main(String[] args) {
Service spark = ignite()
.ipAddress("127.0.0.1")
.port(3141);

// Should be a post(), using get() so I can test from a browser.
spark.get("/Stop", (req, res) -> { spark.stop(); return true; });

spark.awaitInitialization();
System.out.println("Initialized at: " + Instant.now().toString());

spark.awaitStop();
System.out.println("Stopped at: " + Instant.now().toString());

// I want to start a new service here with a new address and/or port.
}
}

我希望立即打印出“Initialized at”消息,但“Stopped at”消息应该不会打印,直到我从浏览器中尝试输入“http://127.0.0.1:3141/Stop ”。

然而,两条消息几乎立即按顺序打印出来。

Initialized at: 2020-02-28T17:20:31.291Z
Stopped at: 2020-02-28T17:20:31.291Z

从根本上来说,我想要一种方法来停止当前正在运行的服务,确保它完全完成运行,然后启动一个新服务,所有这些都在当前正在运行的 JVM 中进行。

最佳答案

简短回答:awaitStop() 在倒计时锁存器上使用await(),但该锁存器在调用 stop 之前不会初始化。

Service.java 中的awaitStop()

    public void awaitStop() {
try {
stopLatch.await();

内部stop():

   public synchronized void stop() {
// Some code elided.
initiateStop();

initateStop() 内部:

    private void initiateStop() {
stopLatch = new CountDownLatch(1);

因此,如果想等待特定的重启信号,我可以添加自己的锁存器:

        CountDownLatch latch = new CountDownLatch(1);

spark.get("/Stop", (req, res) -> { latch.countDown(); spark.stop(); return true; });

spark.awaitInitialization();
System.out.println("Initialized at: " + Instant.now().toString());

latch.await();
spark.awaitStop();

这似乎给出了我想要的结果。

关于java - SparkJava的awaitStop()方法立即返回,即使在初始化之后也是如此,但stop()尚未被调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60456850/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com