0

我在 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 中是否有一些设置可以更改以强制等待线程弱化?请。帮助,我在这里完全迷失了。

谢谢

4

1 回答 1

0

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

我想正在发生的事情是浏览器偶尔不请求请求,这导致服务器端线程偶尔卡住。

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

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

于 2010-12-28T03:05:17.883 回答