You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@logging.apache.org by rp...@apache.org on 2017/06/24 10:57:49 UTC
[3/8] logging-log4j2 git commit: LOG4J2-1926 Remove references to
java.lang.management package
LOG4J2-1926 Remove references to java.lang.management package
- make inner interface ThreadInfoFactory public
- obtain ThreadInfoFactory instance from ServiceLoader, fall back to BasicThreadInfoFactory
- move ExtendedThreadInfoFactory out of ThreadDumpMessage class
Project: http://git-wip-us.apache.org/repos/asf/logging-log4j2/repo
Commit: http://git-wip-us.apache.org/repos/asf/logging-log4j2/commit/d0023dee
Tree: http://git-wip-us.apache.org/repos/asf/logging-log4j2/tree/d0023dee
Diff: http://git-wip-us.apache.org/repos/asf/logging-log4j2/diff/d0023dee
Branch: refs/heads/master
Commit: d0023dee94ecee680ee3cdc0be31313337fd49ad
Parents: a0fcb15
Author: rpopma <rp...@apache.org>
Authored: Sat Jun 24 19:52:48 2017 +0900
Committer: rpopma <rp...@apache.org>
Committed: Sat Jun 24 19:52:48 2017 +0900
----------------------------------------------------------------------
.../log4j/message/ThreadDumpMessage.java | 71 +++++++++-----------
1 file changed, 30 insertions(+), 41 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/logging-log4j2/blob/d0023dee/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java
----------------------------------------------------------------------
diff --git a/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java b/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java
index 4cf7478..4fd1347 100644
--- a/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java
+++ b/log4j-api/src/main/java/org/apache/logging/log4j/message/ThreadDumpMessage.java
@@ -19,13 +19,13 @@ package org.apache.logging.log4j.message;
import java.io.InvalidObjectException;
import java.io.ObjectInputStream;
import java.io.Serializable;
-import java.lang.management.ManagementFactory;
-import java.lang.management.ThreadInfo;
-import java.lang.management.ThreadMXBean;
-import java.lang.reflect.Method;
import java.util.HashMap;
+import java.util.Iterator;
import java.util.Map;
+import java.util.ServiceConfigurationError;
+import java.util.ServiceLoader;
+import org.apache.logging.log4j.status.StatusLogger;
import org.apache.logging.log4j.util.StringBuilderFormattable;
import org.apache.logging.log4j.util.Strings;
@@ -34,36 +34,20 @@ import org.apache.logging.log4j.util.Strings;
*/
@AsynchronouslyFormattable
public class ThreadDumpMessage implements Message, StringBuilderFormattable {
-
private static final long serialVersionUID = -1103400781608841088L;
-
- private static final ThreadInfoFactory FACTORY;
+ private static ThreadInfoFactory FACTORY;
private volatile Map<ThreadInformation, StackTraceElement[]> threads;
-
private final String title;
-
private String formattedMessage;
- static {
- final Method[] methods = ThreadInfo.class.getMethods();
- boolean basic = true;
- for (final Method method : methods) {
- if (method.getName().equals("getLockInfo")) {
- basic = false;
- break;
- }
- }
- FACTORY = basic ? new BasicThreadInfoFactory() : new ExtendedThreadInfoFactory();
- }
-
/**
* Generate a ThreadDumpMessage with a title.
* @param title The title.
*/
public ThreadDumpMessage(final String title) {
this.title = title == null ? Strings.EMPTY : title;
- threads = FACTORY.createThreadInfo();
+ threads = getFactory().createThreadInfo();
}
private ThreadDumpMessage(final String formattedMsg, final String title) {
@@ -71,6 +55,29 @@ public class ThreadDumpMessage implements Message, StringBuilderFormattable {
this.title = title == null ? Strings.EMPTY : title;
}
+ private static ThreadInfoFactory getFactory() {
+ if (FACTORY == null) {
+ FACTORY = initFactory(ThreadDumpMessage.class.getClassLoader());
+ }
+ return FACTORY;
+ }
+
+ private static ThreadInfoFactory initFactory(final ClassLoader classLoader) {
+ ServiceLoader<ThreadInfoFactory> serviceLoader = ServiceLoader.load(ThreadInfoFactory.class, classLoader);
+ ThreadInfoFactory result = null;
+ try {
+ Iterator<ThreadInfoFactory> iterator = serviceLoader.iterator();
+ while (result == null && iterator.hasNext()) {
+ result = iterator.next();
+ }
+ } catch (ServiceConfigurationError | LinkageError | Exception unavailable) { // if java management classes not available
+ StatusLogger.getLogger().info("ThreadDumpMessage uses BasicThreadInfoFactory: " +
+ "could not load extended ThreadInfoFactory: {}", unavailable.toString());
+ result = null;
+ }
+ return result == null ? new BasicThreadInfoFactory() : result;
+ }
+
@Override
public String toString() {
return getFormattedMessage();
@@ -162,7 +169,7 @@ public class ThreadDumpMessage implements Message, StringBuilderFormattable {
/**
* Factory to create Thread information.
*/
- private interface ThreadInfoFactory {
+ public static interface ThreadInfoFactory {
Map<ThreadInformation, StackTraceElement[]> createThreadInfo();
}
@@ -183,24 +190,6 @@ public class ThreadDumpMessage implements Message, StringBuilderFormattable {
}
/**
- * Factory to create extended thread information.
- */
- private static class ExtendedThreadInfoFactory implements ThreadInfoFactory {
- @Override
- public Map<ThreadInformation, StackTraceElement[]> createThreadInfo() {
- final ThreadMXBean bean = ManagementFactory.getThreadMXBean();
- final ThreadInfo[] array = bean.dumpAllThreads(true, true);
-
- final Map<ThreadInformation, StackTraceElement[]> threads =
- new HashMap<>(array.length);
- for (final ThreadInfo info : array) {
- threads.put(new ExtendedThreadInformation(info), info.getStackTrace());
- }
- return threads;
- }
- }
-
- /**
* Always returns null.
*
* @return null