Ich benutze Java Web Server auf Jetty 6 auf Ubunu, für Reverse-Ajax-basierte Web. Und ich habe ernsthafte Probleme mit verzögerten Threads, die Daten an Browser senden. Sehr oft fängt ein Thread erst lange an zu schlafen. Wie 1 Sekunde und mehr, manchmal sogar Stunden. Ich dachte zuerst, dass es Bug der Ajax-Bibliothek (DWR), als dass es Jetty Problem ist, als dass es Java-Bug ist, aber alle Vermutungen sind wahrscheinlich falsch. Ich habe Wochen verloren, um dieses Problem zu lösen. Ich bin komplett verloren. Der einzige Gedanke, den ich nicht versucht habe, ist, es auf einem anderen Betriebssystem wie Windows auszuführen. Hier ist die Stacktrace des Fadens in der Regel hinkt:Java Thread lags/lange schläft auf Ubuntu/Jetty
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)
Wenn ich verschiedene Anlegesteg Verbindung Selector versucht, Stack-Trace war anders, aber es war auf einem ähnlichen Ort warten. Ich habe viele Versionen von Kombinationen von Jetty und Java ausprobiert. Ich dachte, es könnte ein NIO-Fehler sein, aber als ich den Selektor auf "Nicht-Nio" änderte, wurde er an anderer Stelle gestapelt.
Kann das Problem auf Linux sein? Ich führe es als root. Gibt es eine Einstellung in Ubuntu, die ich ändern kann, um wartende Threads zu schwächen, so wie sie sollten? Pls. Hilfe, ich bin hier völlig verloren.
dank
Hallo, danke für die Antwort, aber es ist offensichtlich kein Fehler von DWR. Ich habe mit 2 Hauptentwicklern von DWR geschrieben und beide sagten mir, dass es kein Bug von DWR ist, aber wahrscheinlich Jetty. Aber ich habe alle Versionen von Jetty ausprobiert, und Bug ist in allen gleich, und ich habe keine Antwort vom Jetty-Forum . Das Problem ist, dass Jetty die beste Lösung ist, dank seiner Continuation Machanism, die Tausende von Verbindungen nur in einer konstanten Anzahl von Threads verarbeiten kann. Andere Web-Container verwenden Thread pro Verbindungsmodell. Ich suchte diesen Bug und es gibt hudge Anzahl von Leuten, die Problem mit NIO und JAVA 6 unter Linux. Aber keine Lösung. –