【问题标题】:SparkJava awaitStop() method returns immediately, even after initialization, but stop() has not been calledSparkJava awaitStop() 方法立即返回,即使在初始化之后,但 stop() 还没有被调用
【发布时间】:2020-02-29 03:54:45
【问题描述】:

我有一个使用 SparkJava 2.9.1 构建的小型 REST 服务,其中包括一个用于更改服务绑定 IP 地址和端口的 API。如果更改了这些设置,我想停止当前服务并使用新值重新启动它,而不退出 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”消息,但在我从浏览器尝试“http://127.0.0.1:3141/Stop”之前,不应打印“Stopped at”消息。

然而发生的情况是两条消息几乎立即按顺序打印出来。

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

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

【问题讨论】:

    标签: java spark-java


    【解决方案1】:

    简短回答: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();
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-16
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-12
      • 1970-01-01
      相关资源
      最近更新 更多