如何处理从 Undertow 工作线程抛出的异常?

Posted

技术标签:

【中文标题】如何处理从 Undertow 工作线程抛出的异常?【英文标题】:How to handle exceptions thrown from Undertow worker threads? 【发布时间】:2016-10-11 17:53:30 【问题描述】:

我有一个运行嵌入式 Undertow 的 Web 服务,一些处理程序利用常见的 Undertow 模式将请求卸载到工作线程:

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

这对性能很有好处,但在处理错误处理时会出现问题。我创建了一个自定义 ErrorHandler,它将 Java 异常映射到 HTTP 响应类型和日志级别,并允许 API 处理程序本身只是冒泡异常而不用担心处理它们。不幸的是,对于分派到工作线程的请求,它们永远不会进入 ErrorHandler,如果它们抛出异常,总是会导致 500 错误。有什么方法可以捕获工作线程抛出的异常,还是我必须在每个 API 处理程序中实现异常处理?

【问题讨论】:

可以为每个线程设置UncaughtExceptionHandler来处理线程抛出的异常 处理程序需要访问 HttpServerExchange 以获取失败的请求。如果我控制所有处理程序的代码,则可以将其传递进去,但是有很多内置处理程序可以使用,例如github.com/undertow-io/undertow/blob/master/core/src/main/java/…。 【参考方案1】:

我最终在链的早期添加了一个处理程序,该处理程序立即将请求分派到工作线程。然后我在exchange.isInIoThread()检查之外添加了我的错误处理逻辑,确保错误处理程序和引发异常的处理程序始终在同一个线程上。

【讨论】:

以上是关于如何处理从 Undertow 工作线程抛出的异常?的主要内容,如果未能解决你的问题,请参考以下文章

如何处理spring boot 2中@Requestbody中的对象抛出的异常

springboot如何处理过滤器filter中抛出的异常

java是如何处理异常的?

为啥不能在主线程中直接捕获和处理工作线程抛出的异常?

京东二面:线程池中的线程抛出了异常,该如何处理?大部分人都会答错!

当try块中有多个异常发生时,如何处理?