diff --git a/common/src/main/java/org/apache/rocketmq/common/ThreadFactoryImpl.java b/common/src/main/java/org/apache/rocketmq/common/ThreadFactoryImpl.java index a76f605f79b..a21fb35c189 100644 --- a/common/src/main/java/org/apache/rocketmq/common/ThreadFactoryImpl.java +++ b/common/src/main/java/org/apache/rocketmq/common/ThreadFactoryImpl.java @@ -19,8 +19,14 @@ import java.util.concurrent.ThreadFactory; import java.util.concurrent.atomic.AtomicLong; +import org.apache.rocketmq.common.constant.LoggerName; +import org.apache.rocketmq.logging.InternalLogger; +import org.apache.rocketmq.logging.InternalLoggerFactory; public class ThreadFactoryImpl implements ThreadFactory { + + private static final InternalLogger LOGGER = InternalLoggerFactory.getLogger(LoggerName.COMMON_LOGGER_NAME); + private final AtomicLong threadIndex = new AtomicLong(0); private final String threadNamePrefix; private final boolean daemon; @@ -51,6 +57,12 @@ public ThreadFactoryImpl(final String threadNamePrefix, boolean daemon, BrokerId public Thread newThread(Runnable r) { Thread thread = new Thread(r, threadNamePrefix + this.threadIndex.incrementAndGet()); thread.setDaemon(daemon); + + // Log all uncaught exception + thread.setUncaughtExceptionHandler((t, e) -> + LOGGER.error("[BUG] Thread has an uncaught exception, threadId={}, threadName={}", + t.getId(), t.getName(), e)); + return thread; } }