gpt4 book ai didi

java - tomcat中的非容器线程错误是什么?

转载 作者:太空狗 更新时间:2023-10-29 22:56:16 26 4
gpt4 key购买 nike

在我的 Tomcat7catalina.out 日志中,我收到由第三方库引起的错误,该错误以以下内容开头:

INFO: An error occurred in processing while on a non-container thread. The connection will be closed immediately
java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:113)

错误发生在非容器线程中究竟意味着什么?

我试图通过从我的应用程序代码生成的新 Thread 中抛出异常来获取类似的日志消息:

new Thread(){
@Override
public void run() {
Integer.parseInt("boom");
}
}.start();

但结果是

Exception in thread "Thread-28" java.lang.NumberFormatException: For input string: "boom"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:492)
at java.lang.Integer.parseInt(Integer.java:527)
at ...

所以问题是:当我看到像上面引用的那样的日志时,这意味着什么?错误发生在非容器线程中是什么意思?我怎样才能重新创建它?

最佳答案

What does it really mean that the error occurred in a non-container thread?

当您使用 JSP 3.0+ 异步请求处理时会发生这种情况。

在异步模式下,客户端请求由调用 Servlet 的 service() 方法的“容器”线程接收。此方法(或附属的 doXxxx 方法之一)调用 startAsync() 为请求创建一个 Runnable 并将其分派(dispatch)给执行器。然后,该执行程序处理(“非容器”)工作线程上的请求。

(可以在 here 中找到关于异步模式下发生的事情的更详细解释,并附有示例。)

无论如何,“INFO:”消息只是说原始异常是在执行程序的工作线程之一的堆栈上抛出的。它在 Tomcat 决定将失败的请求分派(dispatch)回容器线程以便可以执行请求清理时产生。

在您的示例中,我怀疑最初的 SocketException 是由于请求处理花费的时间太长,以至于客户端(例如用户的浏览器)使请求超时并关闭了套接字。一段时间后,您的服务器尝试写入响应,但由于连接已关闭而失败。

How can I recreate that?

我在猜测,但您应该能够通过在 Runnablerun() 方法中抛出异常来重现“INFO:”消息。当然,您必须使用异步模式。

关于java - tomcat中的非容器线程错误是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37061522/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com