Java Thread在Ubuntu / Jetty上滞后/长时间休眠

时间:2010-12-28 00:26:55

标签: java linux ubuntu jetty dwr

我在Ubunu上的Jetty 6上运行Java Web服务器,用于基于reverse-ajax的web。我遇到严重的问题,即滞后的线程会将数据重新发送到浏览器。很多时候,一些线程开始长时间睡眠。像1秒或更长时间,有时甚至是几小时。我首先想到的是ajax库(DWR)的bug,而不是Jetty问题,而不是它是Java bug,但所有的怀疑都可能是错误的。我试图解决这个问题几个星期。我完全迷失了。我没想过的唯一想法是在另一个操作系统上运行它,比如windows。这是线程的堆栈跟踪,通常滞后:

Cancelled at this stacktrace:   at java.lang.Object.wait(Native Method)
  at org.mortbay.io.nio.SelectChannelEndPoint.blockWritable(SelectChannelEndPoint.java:279)
  at org.mortbay.jetty.AbstractGenerator$Output.blockForOutput(AbstractGenerator.java:544)
  at org.mortbay.jetty.AbstractGenerator$Output.flush(AbstractGenerator.java:571)
  at org.mortbay.jetty.HttpConnection$Output.flush(HttpConnection.java:997)
  at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:648)
  at org.mortbay.jetty.AbstractGenerator$Output.write(AbstractGenerator.java:579)
  at java.io.ByteArrayOutputStream.writeTo(ByteArrayOutputStream.java:109)
  at org.mortbay.jetty.AbstractGenerator$OutputWriter.write(AbstractGenerator.java:903)
  at org.mortbay.jetty.AbstractGenerator$OutputWriter.write(AbstractGenerator.java:752)
  at org.mortbay.jetty.AbstractGenerator$OutputWriter.write(AbstractGenerator.java:741)
  at java.io.PrintWriter.write(PrintWriter.java:412)
  at java.io.PrintWriter.write(PrintWriter.java:429)
  at java.io.PrintWriter.print(PrintWriter.java:559)
  at java.io.PrintWriter.println(PrintWriter.java:695)
  at org.directwebremoting.dwrp.PlainScriptConduit.addScript(PlainScriptConduit.java:93)
  at org.directwebremoting.impl.DefaultScriptSession.addScript(DefaultScriptSession.java:239)
  at server.comunication.dwr.OneReverseDWRServer.sendLocalBuffer(OneReverseDWRServer.java:385)
  at server.comunication.dwr.OneReverseDWRServer.sendMessageLocal(OneReverseDWRServer.java:363)
  at server.comunication.dwr.OneReverseDWRServer.sendMessage(OneReverseDWRServer.java:412)
  at server.comunication.messaging.SendTask.call(SendTask.java:53)
  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303)
  at java.util.concurrent.FutureTask.run(FutureTask.java:138)
  at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
  at java.lang.Thread.run(Thread.java:619)

当我尝试不同的码头连接选择器时,堆栈跟踪不同但它在某个类似的地方等待。我尝试了许多版本的Jetty和Java组合。我认为它可能是NIO错误,但当我将选择器更改为非nio时,它被堆叠在其他地方。

Linux上可能有问题吗?我以root身份运行它。在ubuntu中是否有一些设置我可以改变以强制等待线程弱化它们应该如何? PLS。帮助,我完全迷失在这里。

谢谢

1 个答案:

答案 0 :(得分:0)

我不确定我知道反向AJAX是什么,但我认为它是服务器通过浏览器向用户的浏览器发送请求(实际上)发送定期请求以请求请求的地方。

我认为发生的事情是浏览器偶尔没有请求请求,这导致服务器端线程偶尔被卡住。

在你正在使用的Java版本,Jetty版本或Linux中,这不太可能是nio与非nio之间的错误。

它可能是您正在使用的DWR库中的一个错误,但它也可能只是您正在做的事情所固有的。例如,如果用户关闭正在运行客户端的浏览器窗口或窗格......或者如果网络中断...那么浏览器可能根本无法请求请求。然后,服务器线程可能会等待永远不会返回的客户端。如果这是正在发生的事情,那么需要有一些东西来解除服务器端线程的阻塞。 (我以为那是DWR的责任,但我不是专家......)。