我現在用的是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。
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<Pattern>${defaultPattern}</Pattern>
</encoder>
</appender>
<root level="DEBUG">
<appender-ref ref="STDOUT" />
</root>
如果我設置日誌記錄級別爲WARN或錯誤它仍然工作正常,但是當我將它設置爲INFO或降低然後我得到這個異常:
例外:java.lang中。 IllegalStateException異常在線程從UncaughtExceptionHandler的拋出 「關閉鉤子線程刪除臨時DB的/ var /文件夾/ T5/lr8ytf257hb9_649cjp9hkn40000gn/T/MariaDB4j /數據/ 3306」
「關閉鉤子線程刪除臨時DB ......」是線程regi的名稱在上面的第一段代碼中嵌入。
結果是我剩下一個mysqld進程正在運行。這樣可以防止測試再次運行,因爲MariaDB4j抱怨並且不會啓動新的數據庫。
一旦我殺了mysqld進程比我可以再次運行我的測試,但是同樣的事情發生。
我認爲這是一個JVM問題。我沒有看到日誌級別如何防止關閉掛鉤正常工作。
我在集成測試中使用MariaDB4j。當我用IntelliJ或Eclipse運行它們時,它不會得到這個錯誤。當我用gradle運行它們時(作爲構建任務的一部分),我只能得到它。
什麼可能導致這種情況,以及如何避免它?
何真酷!我可以看到它在最新版本3.5 https://docs.gradle.org/3.5/release-notes.html(ticket 1387)中得到了實際解決。我會嘗試升級到3.5,看看它是否有效。 – Bentaye
我試過Gradle v3.5,它修復了我的問題。你能用這些信息編輯你的答案,我會接受它。 – Bentaye
我編輯了我的答案。 – Sebastian