我有一个运行嵌入式Undertow的Web服务,一些处理程序利用常见的Undertow模式将请求卸载到工作线程:
if (exchange.isInIoThread()) {
exchange.dispatch(this);
}
这对性能非常有用,但在处理错误处理时存在问题。 我创建了一个自定义的错误处理程序,它将 Java 异常映射到 HTTP 响应类型和日志级别,并允许 API 处理程序本身只冒泡异常,而不必担心处理它们。 遗憾的是,对于调度到工作线程的请求,它们永远不会进入 ErrorHandler,如果它们引发异常,则始终会导致 500 错误。 有没有办法捕获从工作线程引发的异常,或者我是否必须在每个 API 处理程序中实现异常处理?
我最终在链的早期添加一个处理程序,该处理程序立即将请求调度到工作线程。 然后,我在exchange.isInIoThread()
检查之外添加了错误处理逻辑,确保错误处理程序和引发异常的处理程序始终位于同一线程上。