Как обрабатывать исключения, генерируемые рабочими потоками Undertow?

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

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

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


person Jared    schedule 10.06.2016    source источник
comment
Вы можете установить UncaughtExceptionHandler для каждого потока, чтобы обрабатывать исключения, создаваемые потоками.   -  person Saravana    schedule 10.06.2016
comment
Обработчику необходим доступ к HttpServerExchange для неудачного запроса. Было бы возможно передать это, если бы я контролировал код для всех обработчиков, но есть много встроенных обработчиков, которые используются, такие как github.com/undertow-io/undertow/blob/master/ ядро/src/main/java/.   -  person Jared    schedule 10.06.2016


Ответы (1)


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

person Jared    schedule 08.07.2016