WebLogic阻止了线程保护

dou*_*lep 21 weblogic java-ee weblogic-10.x

默认情况下,WebLogic在15分钟(600秒)后杀死卡住的线程,这由StuckThreadMaxTime参数控制.但是,我找不到关于如何定义"卡住"的更多细节.特别:

  • 15分钟倒计时开始的重点是什么.请求处理开始?最后wait()的方法?别的什么?
  • 这仅适用于请求处理线程还是所有线程?也就是说,请求处理线程可以通过为长期任务生成工作线程来"逃避"这种保护吗?特别是,它可以在没有15分钟倒计时的情况下将响应写入这样的工作人员吗?

我的用例是通过权限系统下载大文件.由于用户需要进行身份验证并具有查看文件的权限,因此我无法(或至少不知道如何)将其留给简单的HTTP服务器,例如Apache.而且由于文件可能很大,下载(至少在理论上)可能需要超过15分钟.

Jos*_*seK 22

Weblogic的确实杀后的阻塞线程StuckThreadMaxTime.它不能这样做,消息只是一个状态信息,所以你(即管理员)知道线程已经超过10分钟(600秒= 10分钟,而不是15分钟)

这是一个可配置的值.

当线程开始处理服务器内的请求时,计时器启动.线程不会被杀死,但实际上会继续处理,直到操作结束.所以在你的情况下,你不需要担心线程被杀死,它只是告诉你所花费的时间 - 你在这个用例中知道.

它适用于所有线程AFAIK - 任何生成的线程也将在相同的规则下运行.

恕我直言,Weblogic(或任何应用程序服务器)不是存储和提供大文件的地方.这理想地适用于Web服务器层 - 我们使用可以运行文件下载servlet的SunOne.在您的情况下,您需要Tomcat和您的Apache来优化它.

  • 如果存在太多卡住的线程,服务器将停止响应新请求 - 但在您的情况下,它们并非真正"卡住"但处理长请求.更好的方法是给FileDownloadServlet它自己的执行线程池 - 在WL10上,这将是一个专用的WorkManager.这可确保下载中遇到/影响的任何线程不会影响处理正常请求的其余服务器.请点击此处了解更多信息 - http://download.oracle.com/docs/cd/E11035_01/wls100/config_wls/self_tuned.html#wp1059038.您可以为该servlet定义调度策略. (6认同)

小智 7

WLS10 WorkManager文档可能会引起一些真正的头痛.请参阅http://blogs.oracle.com/jamesbayer/2010/01/work_manager_leash_for_slow_js.html,了解如何在weblogic.xml中为webapp定义WorkManager并分配特定servlet以使用它的分步示例.

添加到该示例,您可以添加<ignore-stuck-threads>true</ignore-stuck-threads><work-manager>定义中,该定义应该防止为该WorkManager工作的线程针对失败的服务器状态进行计数.