Я использую веб-сервер Java на Jetty 6 на Ubunu, для веба на основе обратного ajax. И у меня серьезные проблемы с запаздывающими потоками, которые пересылают данные в браузеры. Очень часто некоторые нити просто начинают спать долго. Как 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, но когда я изменил селектор на non-nio, он сложился в другом месте.
Может быть проблема в Linux? Я запускаю его как root. Есть ли какие-то настройки в Ubuntu, которые я могу изменить, чтобы заставить ожидающие потоки ослабевать, как они должны? Pls. помогите, я полностью потерялся здесь.
спасибо