低日志记录级别阻止关闭挂钩正常运行

时间:2017-04-24 08:03:14

标签: mysql jvm mariadb logback shutdown-hook

我正在使用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并创建了一个Console 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或ERROR它仍然可以正常工作,但当我将其设置为INFO或更低时,我得到此异常:

  

异常:从线程中的UncaughtExceptionHandler抛出java.lang.IllegalStateException“临时DB的关闭钩子删除线程/ var / folders / t5 / lr8ytf257hb9_649cjp9hkn40000gn / T / MariaDB4j / data / 3306”

“Temporary DB的Shutdown Hook Deletion Thread ...”是上面第一段代码中注册的线程的名称。

结果是我正在运行mysqld进程。这可以防止测试再次运行,因为MariaDB4j抱怨它并且不会启动新的数据库。

一旦我杀死了mysqld进程,我就可以再次运行我的测试,但同样的事情发生了。

我认为这是一个JVM问题。我没有看到日志记录级别如何阻止关闭钩子正常工作。

我在集成测试中使用MariaDB4j。当我使用IntelliJ或Eclipse运行它时,它不会出现此错误。我只有在用gradle运行它时才能得到它(作为构建任务的一部分)。

可能导致这种情况以及如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

我有类似的问题。它是由Gradle问题引起的,其描述为there

可以通过将Gradle降级到3.2版或升级到3.5版来解决。