Низкий уровень ведения журнала, препятствующий правильной работе обработчика выключения

Я использую библиотеку MariaDb4j для своих интеграционных тестов, и она регистрирует отключение таким образом:

    protected void cleanupOnExit() {
    String threadName = "Shutdown Hook Deletion Thread for Temporary DB " + dataDir.toString();
    final DB db = this;
    Runtime.getRuntime().addShutdownHook(new Thread(threadName) {

        @Override
        public void run() {
            // ManagedProcess DestroyOnShutdown ProcessDestroyer does
            // something similar, but it shouldn't hurt to better be save
            // than sorry and do it again ourselves here as well.
            try {
                // Shut up and don't log if it was already stop() before
                if (mysqldProcess != null && mysqldProcess.isAlive()) {
                    logger.info("cleanupOnExit() ShutdownHook now stopping database");
                    db.stop();
                }
            } catch (ManagedProcessException e) {
                logger.warn("cleanupOnExit() ShutdownHook: An error occurred while stopping the database", e);
            }

            if (dataDir.exists() && Util.isTemporaryDirectory(dataDir.getAbsolutePath())) {
                logger.info("cleanupOnExit() ShutdownHook quietly deleting temporary DB data directory: " + dataDir);
                FileUtils.deleteQuietly(dataDir);
            }
            if (baseDir.exists() && Util.isTemporaryDirectory(baseDir.getAbsolutePath())) {
                logger.info("cleanupOnExit() ShutdownHook quietly deleting temporary DB base directory: " + baseDir);
                FileUtils.deleteQuietly(baseDir);
            }
        }
    });
}

Это работало нормально. Но затем я добавил Logback и создал приложение консоли.

    <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
      <encoder>
          <Pattern>${defaultPattern}</Pattern>
      </encoder>
  </appender>

  <root level="DEBUG">
      <appender-ref ref="STDOUT" />
  </root>

Если я устанавливаю уровень ведения журнала в WARN или ERROR, он все еще работает нормально, но когда я устанавливаю его в INFO или ниже, я получаю это исключение:

Исключение: исключение java.lang.IllegalStateException, выброшенное из UncaughtExceptionHandler в потоке «Поток удаления перехватчика выключения для временной БД /var/folders/t5/lr8ytf257hb9_649cjp9hkn40000gn/T/MariaDB4j/data/3306»

«Поток удаления перехватчика выключения для временной базы данных…» — это имя потока, зарегистрированного в первом фрагменте кода выше.

В результате у меня остался запущенный процесс mysqld. И это предотвращает повторный запуск тестов, поскольку MariaDB4j жалуется на это и не запускает новую базу данных.

Как только я убиваю процесс mysqld, я могу снова запустить свои тесты, но затем происходит то же самое.

Я предполагаю, что это проблема JVM. Я не понимаю, как уровень ведения журнала может помешать правильной работе перехватчика выключения.

Я использую MariaDB4j в своих интеграционных тестах. Когда я запускаю их с IntelliJ или Eclipse, эта ошибка не появляется. Я получаю это только тогда, когда запускаю их с помощью Gradle (как часть задачи сборки).

С чем это может быть связано и как это обойти?


person Bentaye    schedule 24.04.2017    source источник


Ответы (1)


У меня была аналогичная проблема. Это было вызвано проблемой Gradle, которая описана здесь.

Это можно решить, понизив Gradle до версии 3.2 или обновив до версии 3.5.

person Sebastian    schedule 25.04.2017
comment
Хо реально круто! Я вижу, что это действительно исправлено в последней версии 3.5 docs.gradle.org/3.5 /release-notes.html (тикет 1387). Я попробую обновиться до 3.5 и посмотреть, работает ли это. - person Bentaye; 25.04.2017
comment
Я попробовал Gradle v3.5, это решает мою проблему. Можете ли вы отредактировать свой ответ с этой информацией, и я приму ее. - person Bentaye; 25.04.2017