【发布时间】:2012-04-04 10:29:24
【问题描述】:
我在 linux 服务器上遇到了 JBoss AS 7 的奇怪行为。当我使用我的应用程序部署战争时,服务器不会响应此应用程序的有效 HTTP 请求。当我尝试获取一个有效的 URL 时,我可以在日志中看到调用了后端函数(例如 DAO 方法),调试日志显示我的 JSF 中的后续标记已呈现,我什至可以看到一条消息 Rendering View index.xml,但是响应永远不会到达客户端。
当我使用不存在的 URL(例如index.asd)时,响应为 404,而当我使用错误的页面名称(例如inswxasd.xhtml)时,响应为 500。因此它仅在有效请求时才会失败。
我尝试远程连接(使用 firefox)和本地连接(使用wget)并且我重现了这个问题。奇怪的是,我部署了我已经使用过的战争,然后它起作用了。
编辑 1:
我刚刚注意到,当我发送请求时,服务器进程占用了 200% 的 CPU。此外,只有一个具有堆栈的应用程序会发生这种情况:Hibernate、Spring、JSF 2.0、Primefaces。
编辑 2:
这里是pastie with jstack output (jstack -l -F <PID>)。所有线程都被阻塞。
此外,我注意到(使用top 并转储JBoss 进程的堆栈)该问题很可能是由名为http--0.0.0.0-8080-1 的线程引起的。有什么想法吗?
【问题讨论】:
-
“服务器进程占用了 200% 的 CPU。” 显然它在某处无限循环运行。很难说在哪里,因为你没有显示任何代码 :) 运行调试器/分析器来确定它。
-
谢谢,这个问题只出现在服务器上。也许你知道任何用于 JVM 监控(线程、打开文件等)的 linux 控制台工具?
-
您可以使用 VisualVM 或 JConsole 查看哪些线程正在阻塞。这是我第一次听说这个。
-
谢谢,但我正在寻找基于控制台的东西(因为我在服务器上没有图形环境)。
-
很难说它可能是什么。是否可以仅出于测试目的从混合物中删除 Spring?我在 jstack 输出中看到了一些对 ActiveMQ 的引用,但在 AS 7 中,HornetQ 用于消息传递。可能与它无关,只是指出来。