Я использую библиотеку 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 (как часть задачи сборки).
С чем это может быть связано и как это обойти?