blob: 5f60c51d8b37f2bbb6f34602ebd268c943a2a6cd [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.samza.util;
import java.lang.Thread.UncaughtExceptionHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* An UncaughtExceptionHandler that logs the uncaught exception, logs a thread dump, and then
* executes the provided {@code runnable}.
* <p>
* Example usage: Exit process if any thread throws an uncaught exception:
* <pre>
* Thread.setDefaultUncaughtExceptionHandler(
* new SamzaUncaughtExceptionHandler(() -&gt; {
* System.exit(1);
* })
* );
* </pre>
*/
public class SamzaUncaughtExceptionHandler implements UncaughtExceptionHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(SamzaUncaughtExceptionHandler.class);
private final Runnable runnable;
public SamzaUncaughtExceptionHandler(Runnable runnable) {
this.runnable = runnable;
}
/**
* Method invoked when the given thread terminates due to the
* given uncaught exception.
* <p>Any exception thrown by this method will be ignored by the
* Java Virtual Machine.
*
* @param t the thread
* @param e the exception
*/
@Override
public void uncaughtException(Thread t, Throwable e) {
String msg = String.format("Uncaught exception in thread %s.", t.getName());
LOGGER.error(msg, e);
System.err.println(msg);
e.printStackTrace(System.err);
try {
ThreadUtil.logThreadDump("Thread dump from uncaught exception handler.");
runnable.run();
} catch (Throwable throwable) {
// Ignore to avoid further exception propagation
}
}
}