Я пишу отдельное приложение, которое должно запускаться и оставаться без присмотра в течение длительных периодов времени.Вместо того, чтобы исключения приводили к остановке, необходимо зарегистрировать исключение с достаточным количеством информации, чтобы сотрудники службы поддержки могли понять, что произошло, и продолжить.
В результате каждое исключение оборачивается в исключение времени выполнения, а затем генерируется для регистрации в другой части приложения.Я использую теги aop: config, чтобы создать аспект для регистрации исключений времени выполнения, которые выдает остальная часть приложения.Затем исключение передаст стек вызовов UncaughtExceptionHandler, чтобы завершить исключение без вывода сообщений.Однако одно и то же исключение неоднократно перехватывается и регистрируется (каждое исключение записывается отдельным потоком и отправляется в отдельный файл журнала).В отладчике оба исключения имеют одинаковый идентификатор.
Мой applicationContext является базовым для этого:
<aop:config>
<aop:aspect ref="exceptionLoggingAspect">
<aop:after-throwing method="logException"
pointcut="execution(* *.*(..))" throwing="exception" />
</aop:aspect>
</aop:config>
UncaughtExceptionHandler одинаково базов, по крайней мере, пока я не получу его работу:
private void setUncaughtExceptionHandler()
{
final Handler handler = new Handler();
Thread.setDefaultUncaughtExceptionHandler(handler);
}
class Handler implements Thread.UncaughtExceptionHandler
{
@Override
public void uncaughtException(Thread t, Throwable e)
{
System.out.println("Throwable: " + e.getMessage());
System.out.println(t.toString());
}
}
Я экспериментировал, ограничиваяpointcut к одному пакету и выбрасывает исключение из этого пакета (не пакет, в котором ведется регистрация исключений), но оно все равно регистрируется дважды.Есть ли что-то принципиально не так с этой идеей?Советы приветствуются.