0

リバースajaxベースのWeb用に、UbunuのJetty6でJavaWebサーバーを実行しています。また、ブラウザにデータを再送信するスレッドの遅延に深刻な問題があります。非常に多くの場合、一部のスレッドは長時間スリープし始めます。1秒以上のように、時には数時間も。最初に、それはajaxライブラリ(DWR)のバグであり、Jettyの問題であり、Javaのバグであると考えましたが、すべての疑いはおそらく間違っています。私はこの問題を解決しようとして数週間を失いました。私は完全に迷子になっています。私が試しなかった唯一の考えは、Windowsなどの別のOSで実行することです。通常遅れるスレッドのスタックトレースは次のとおりです。

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で問題になる可能性がありますか?ルートとして実行しています。待機中のスレッドを強制的に弱めるように変更できるubuntuの設定はありますか?pls。助けて、私はここで完全に迷子になっています。

ありがとう

4

1 に答える 1

0

逆AJAXが何であるかはわかりませんが、サーバーがリクエストを要求するために定期的なリクエストを送信するブラウザによって(実際には)サーバーがユーザーのブラウザにリクエストを送信しているところだと思います。

ブラウザがリクエストをリクエストしていないことがあり、これが原因でサーバー側のスレッドが時々動かなくなっていると思います。

これは、nio と非 nio、使用している Java のバージョン、Jetty のバージョン、または Linux のバグである可能性は低いです。

使用している DWR ライブラリのバグである可能性がありますが、実行していることに固有のものである可能性もあります。たとえば、ユーザーがクライアント側を実行しているブラウザ ウィンドウまたはペインを閉じた場合、またはネットワークの中断があった場合、ブラウザは単にリクエストのリクエストに失敗する可能性があります。その後、サーバー スレッドは、戻ってこないクライアントを待機してスタックする可能性があります。これが起こっている場合は、サーバー側のスレッドのブロックを解除する何かが必要です。(私はそれが DWR の責任だと思っていたでしょうが、私は専門家ではありません ...)。

于 2010-12-28T03:05:17.883 に答える