SparkJava awaitStop() 方法 returns 立即,即使在初始化之后,但还没有调用 stop()

SparkJava awaitStop() method returns immediately, even after initialization, but stop() has not been called

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

我这样做的基本过程是:

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

我正在使用实例接口来执行此操作,因为我有两个服务,一个在 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();

内部停止():

   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();

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