Author: violetagg Date: Wed Jun 28 09:12:31 2017 New Revision: 1800136 URL: http://svn.apache.org/viewvc?rev=1800136&view=rev Log: Name the thread that cleans the log files and mark it as a daemon thread.
Modified: tomcat/trunk/java/org/apache/juli/FileHandler.java Modified: tomcat/trunk/java/org/apache/juli/FileHandler.java URL: http://svn.apache.org/viewvc/tomcat/trunk/java/org/apache/juli/FileHandler.java?rev=1800136&r1=1800135&r2=1800136&view=diff ============================================================================== --- tomcat/trunk/java/org/apache/juli/FileHandler.java (original) +++ tomcat/trunk/java/org/apache/juli/FileHandler.java Wed Jun 28 09:12:31 2017 @@ -29,6 +29,8 @@ import java.io.UnsupportedEncodingExcept import java.nio.file.DirectoryStream; import java.nio.file.Files; import java.nio.file.Path; +import java.security.AccessController; +import java.security.PrivilegedAction; import java.sql.Timestamp; import java.time.DateTimeException; import java.time.LocalDate; @@ -36,6 +38,8 @@ import java.time.format.DateTimeFormatte import java.time.temporal.ChronoUnit; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; +import java.util.concurrent.ThreadFactory; +import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.locks.ReadWriteLock; import java.util.concurrent.locks.ReentrantReadWriteLock; import java.util.logging.ErrorManager; @@ -93,7 +97,51 @@ import java.util.regex.Pattern; public class FileHandler extends Handler { public static final int DEFAULT_MAX_DAYS = -1; - private static final ExecutorService DELETE_FILES_SERVICE = Executors.newSingleThreadExecutor(); + private static final ExecutorService DELETE_FILES_SERVICE = + Executors.newSingleThreadExecutor(new ThreadFactory() { + private final boolean isSecurityEnabled; + private final ThreadGroup group; + private final AtomicInteger threadNumber = new AtomicInteger(1); + private final String namePrefix = "FileHandlerLogFilesCleaner-"; + + { + SecurityManager s = System.getSecurityManager(); + this.isSecurityEnabled = s != null; + this.group = isSecurityEnabled ? s.getThreadGroup() + : Thread.currentThread().getThreadGroup(); + } + + @Override + public Thread newThread(Runnable r) { + ClassLoader loader = Thread.currentThread().getContextClassLoader(); + try { + // Threads should not be created by the webapp classloader + if (isSecurityEnabled) { + AccessController.doPrivileged((PrivilegedAction<Void>) () -> { + Thread.currentThread() + .setContextClassLoader(getClass().getClassLoader()); + return null; + }); + } else { + Thread.currentThread() + .setContextClassLoader(getClass().getClassLoader()); + } + Thread t = new Thread(group, r, + namePrefix + threadNumber.getAndIncrement()); + t.setDaemon(true); + return t; + } finally { + if (isSecurityEnabled) { + AccessController.doPrivileged((PrivilegedAction<Void>) () -> { + Thread.currentThread().setContextClassLoader(loader); + return null; + }); + } else { + Thread.currentThread().setContextClassLoader(loader); + } + } + } + }); // ------------------------------------------------------------ Constructor --------------------------------------------------------------------- To unsubscribe, e-mail: dev-unsubscr...@tomcat.apache.org For additional commands, e-mail: dev-h...@tomcat.apache.org