WebLogic卡线程保护

22
默认情况下,WebLogic在15分钟(600秒)后杀死挂起的线程,这由“StuckThreadMaxTime”参数控制。然而,我找不到更多关于如何定义“挂起”的细节。具体来说:
- 15分钟倒计时开始的时间点是什么?请求处理开始?最后一个类似于wait()的方法?还是其他什么? - 这是否仅适用于请求处理线程,还是适用于所有线程?即,请求处理线程能否通过为长时间任务生成工作线程来“逃脱”此保护?特别是,它是否可以将响应写入这样的工作线程中,而不受15分钟倒计时的限制?
我的使用情况是通过权限系统下载大文件。由于用户需要经过身份验证并具有查看文件的权限,因此我无法(或者至少不知道如何)将此留给简单的HTTP服务器,例如Apache。而且由于文件可能很大,下载可能需要超过15分钟。
2个回答

22

Weblogic在StuckThreadMaxTime时间到达后并不会强制终止卡住的线程。这是由于它无法这样做,该消息只是一个状态信息,以便您(即管理员)知道该线程已经超过了10分钟(600秒= 10分钟,而不是15分钟)。

这是一个可配置的值。

当线程开始处理服务器请求时,计时器开始计时。线程将不会被杀死,而是继续处理,直到操作完成。所以在你的情况下,你不需要担心线程会被杀死,它只是通知你所用的时间 - 在这个案例中,您已经知道这个时间。

我认为,WebLogic(或任何应用服务器)不适合存储和提供大型文件。这通常是 Web 服务器层的功能 - 我们使用SunOne,在其中可以运行文件下载Servlet。在你的情况下,你需要结合Apache使用Tomcat来进行优化。


好的,但据我所知,如果有太多的阻塞线程,它可以重新部署整个应用程序,对吗?我可能把会话超时和这些混淆了——我们过去曾经遇到过一些问题。至于文件——该应用程序如此庞大且存在缺陷,没有时间花在优化上,因为总是有更紧迫的问题需要解决。 - user319799
6
如果有太多线程卡住,服务器将停止响应新请求 - 但在您的情况下,它们并不是真正“卡住”的线程,而是正在处理长时间的请求。更好的方法是给FileDownloadServlet它自己的执行线程池 - 在WL10上,这将是一个专用的WorkManager。这确保了任何堵塞/受影响于下载中的线程都不会影响到服务器处理正常请求的其余部分。在此处查看更多信息 - http://download.oracle.com/docs/cd/E11035_01/wls100/config_wls/self_tuned.html#wp1059038。您可以为该servlet定义调度策略。 - JoseK
一旦管理员解决了这个问题,有没有一种方法可以杀死Weblogic中的卡住的线程? - f1wade
@f1wade:不,这是不可能的。 - JoseK
非常感谢确认,有没有办法将该线程标记为不使用或清除其队列? - f1wade
阅读为什么WebLogic没有失控线程保护的原因:http://blog.pasker.net/2008/04/17/java-platform-infrastructure-edition-part-2/ - rbp

6
WLS10 WorkManager 文档可能会让人感到困惑。请参见 http://blogs.oracle.com/jamesbayer/2010/01/work_manager_leash_for_slow_js.html,了解在 weblogic.xml 中为 Web 应用程序定义 WorkManager 并分配特定 Servlet 使用它的步骤。
在该示例中,可以将<ignore-stuck-threads>true</ignore-stuck-threads>添加到 <work-manager> 定义中,这样应该可以防止属于该 WorkManager 的线程被算入失败的服务器状态。

博客文章已经移动到https://blogs.oracle.com/jamesbayer/work-manager-leash-for-slow-jsps-in-weblogic-server - weberjn

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接