我試圖在Spring啓動應用程序中實現一個全局未捕獲的異常處理程序,該應用程序從一羣客戶端應用程序收集指標和異常等。看起來,處理程序正在設置,當我調試,所以我會假設或者另一個處理程序分配後我的代碼運行,或這些處理程序未設置在春季應用程序上下文?我的代碼如下。Thread.setDefaultUncaughtExceptionHandler在Spring Boot應用程序中沒有被調用
我創造了這個類我默認的異常處理 -
public class JvmrtExceptionHandler implements Thread.UncaughtExceptionHandler {
private static final Logger LOGGER = LoggerFactory.getLogger(JvmrtExceptionHandler.class);
private RestTemplate restTemplate = new RestTemplate();
@Override
public void uncaughtException(Thread thread, Throwable exception) {
String exceptionClass = exception.getStackTrace()[0].getClassName();
String exceptionMethod = exception.getStackTrace()[0].getMethodName();
String exceptionMessage = exception.getMessage();
String exceptionType = exception.getClass().getSimpleName();
String appName = exception.getClass().getPackage().getImplementationTitle();
ExceptionModel thrownException = new ExceptionModel(
exceptionMessage,
appName,
exceptionMethod,
exceptionClass,
exceptionType
);
LOGGER.error("Uncaught Exception thrown of type {}. Sending to JVMRT Main app for processing", exceptionType);
String exceptionUrl = String.format("http://%s:%s/api/", "localhost", 8090);
restTemplate.postForObject(exceptionUrl, thrownException, String.class);
}
}
這個類,其中有前一種應用作爲Maven的依賴其他應用程序,配置默認的處理程序我有創建。我希望該處理程序可以用於所有線程,因此我使用靜態Thread.setDefaultUncaughtExceptionHandler方法來設置它。
@Configuration
public class Config {
@Bean
public JvmrtExceptionHandler jvmrtExceptionHandler() {
JvmrtExceptionHandler exceptionHandler = new JvmrtExceptionHandler();
Thread.setDefaultUncaughtExceptionHandler(exceptionHandler);
return exceptionHandler;
}
}
我使用以下代碼測試處理程序。
@RestController
@RequestMapping(value = "/test")
public class ExceptionTest {
@RequestMapping(value = "/exception", method = RequestMethod.GET)
public void throwException() {
throw new RuntimeException();
}
}
我在做什麼錯?真的在這裏敲我的頭,任何幫助將不勝感激。
瞭解它與ExceptionHandler一起工作。謝謝你的幫助。 –