【发布时间】:2020-02-29 03:54:45
【问题描述】:
我有一个使用 SparkJava 2.9.1 构建的小型 REST 服务,其中包括一个用于更改服务绑定 IP 地址和端口的 API。如果更改了这些设置,我想停止当前服务并使用新值重新启动它,而不退出 JVM。
我这样做的基本过程是:
- 启动服务。
- 调用 awaitInitialiation()(因为我不想在 awaitStop() 初始化之前调用它)。
- 调用 awaitStop() 并等待当前服务完成。
- 从新参数开始。
我正在使用实例接口来执行此操作,因为我有两个服务,一个在 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