Java 线程在 Ubuntu/Jetty 上滞后/长时间 hibernate

标签 java linux ubuntu jetty dwr

我正在 Ubunu 的 Jetty 6 上运行 Java Web 服务器,用于基于反向 ajax 的 Web。而且我在向浏览器重新发送数据的线程滞后方面遇到了严重的问题。很多时候,一些线程开始 hibernate 很长时间。比如 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 连接选择器时,堆栈跟踪有所不同,但它正在等待一些类似的地方。我尝试了很多版本的Jetty和Java的组合。我以为这可能是NIO bug,但是当我将选择器更改为非nio时,它被堆叠在其他地方。

Linux 上可能有问题吗?我以 root 身份运行它。 ubuntu 中是否有一些设置可以更改以强制等待线程按其应有的方式弱化?请。帮助,我完全迷失在这里。

谢谢

最佳答案

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

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

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

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

关于Java 线程在 Ubuntu/Jetty 上滞后/长时间 hibernate ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4542871/

相关文章:

java - 在 Map 值中强制执行两种类型 - Java 泛型

c - Linux 中的奇怪开关

javascript - 我应该如何自动启动node.js脚本

linux - 在 Crontab 中删除现有的作业/任务

php - 更改 mysql 服务器并出现 php 错误,相同的代码,相同的 mysql 版本

python - 覆盖在使用 python 3.8 但不是 3.7 的 Windows 上运行非常缓慢

java - 所需库的存档 : 'lib/Chrome/chromedriver' in project 'XYZ' cannot be read or is not a valid ZIP file using ChromeDriver Selenium Java

java - Hibernate - <property> 值与 <column> 值

java.lang.RuntimeException : ERROR: Failed to recover corrupt cache entry 错误

c - Linux 内核未将完整结构传递给 sysfs 回调