2017-04-24 42 views
0

我現在用的是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運行它們時(作爲構建任務的一部分),我只能得到它。

什麼可能導致這種情況,以及如何避免它?

回答

1

我有類似的問題。它是由描述爲there的Gradle問題引起的。

它可以通過將Gradle降級到版本3.2或升級到版本3.5來解決。

+0

何真酷!我可以看到它在最新版本3.5 https://docs.gradle.org/3.5/release-notes.html(ticket 1387)中得到了實際解決。我會嘗試升級到3.5,看看它是否有效。 – Bentaye

+0

我試過Gradle v3.5,它修復了我的問題。你能用這些信息編輯你的答案,我會接受它。 – Bentaye

+0

我編輯了我的答案。 – Sebastian