我在 Ubunu 的 Jetty 6 上运行 Java Web 服务器,用于基于反向 ajax 的 Web。而且我在将数据重新发送到浏览器的滞后线程方面存在严重问题。很多时候,一些线程刚刚开始长时间休眠。像 1 秒甚至更多,有时甚至是几个小时。我首先认为这是 ajax 库(DWR)的错误,而不是 Jetty 问题,而不是 Java 错误,但所有的怀疑可能都是错误的。为了解决这个问题,我浪费了数周时间。我完全迷失了。我没有尝试的唯一想法是在另一个操作系统上运行它,比如 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 中是否有一些设置可以更改以强制等待线程弱化?请。帮助,我在这里完全迷失了。
谢谢