2016-06-10 2 views
0

У меня есть веб-сервис работает встроенный Undertow, а некоторые из обработчиков использовать общий прибойный картины разгружая запросы рабочих потоков:Как обрабатывать исключения, отбрасываемые из рабочих потоков Undertow?

if (exchange.isInIoThread()) { 
    exchange.dispatch(this); 
} 

Это отлично подходит для работы, но она представляет собой проблему, в решении с обработкой ошибок. Я создал настраиваемый ErrorHandler, который отображает исключения Java для типов ответов HTTP и уровней журналов и позволяет самим обработчикам API просто создавать пузырьки исключений и не беспокоиться о их обработке. К сожалению, для запросов, которые отправляются в рабочий поток, они никогда не попадают в ErrorHandler, всегда приводя к ошибке 500, если они генерируют исключение. Есть ли способ уловить исключения, созданные из рабочих потоков, или мне нужно реализовать обработку исключений в каждом обработчике API?

+0

Вы можете установить 'UncaughtExceptionHandler' за поток для обработки исключения, созданного потоками – Saravana

+0

Обработчик нуждается в доступе к HttpServerExchange для отказавшего запроса. Было бы возможно передать это, если я буду управлять кодом для всех обработчиков, но есть много встроенных обработчиков, которые будут использоваться, например https://github.com/undertow-io/undertow/blob/ ведущий/ядро ​​/ SRC/основные/Java/IO/Undertow/безопасность/обработчики/AuthenticationCallHandler.java # L46. – Jared

ответ

1

Я запустил добавление обработчика в начале цепи, который отправляет запрос в рабочий поток немедленно. Затем я добавил свою логику обработки ошибок за пределы проверки exchange.isInIoThread(), гарантируя, что обработчик ошибок и обработчик, который выбрал исключение, всегда находятся в одном потоке.