Метод Spark Java awaitStop () сразу возвращается, даже после инициализации, но stop () не был вызван - PullRequest
0 голосов
/ 28 февраля 2020

У меня есть небольшая служба REST, созданная с помощью Spark Java 2.9.1, которая включает API для изменения привязанного IP-адреса и порта службы. Если эти настройки изменены, я хочу остановить текущую службу и перезапустить ее с новыми значениями, не выходя из JVM.

Мой базовый c процесс для этого:

  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.

1 Ответ

0 голосов
/ 28 февраля 2020

Краткий ответ: awaitStop () использует await () в защелке обратного отсчета, но эта защелка не инициализируется до вызова stop.

awaitStop () в службе. java

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

Внутренняя остановка ():

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

Внутри initateStop ():

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

Так что, если хотите дождаться определенного сигнала перезапуска c, я могу добавить свою собственную защелку :

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

И это, кажется, дает желаемый результат.

...