2010-12-28 10 views
0

私は、Reverse-ajaxベースのWeb用に、UbunuのJetty 6でJava Webサーバーを実行しています。そして、私はブラウザにデータを再送する遅れたスレッドに深刻な問題があります。非常に頻繁にいくつかのスレッドだけで長い時間スリープ状態になります。 1秒以上、場合によっては数時間と同じように。私はそれがJavaのバグであるということよりも、Ajaxライブラリ(DWR)のバグだと思ったのですが、それはJettyの問題だと思っていましたが、すべての疑惑はおそらく間違っています。私はこの問題を解決しようと数週間失った。私は完全に失われています。私が試していないと思うのは、Windowsのような別のOSでそれを実行することだけです。ここでは通常、遅れているスレッドのスタックトレースがある:私は別の桟橋接続セレクタを試みたときJavaスレッドlags/longが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) 

、スタックトレースが異なっていたが、それはいくつかの同様の場所で待っていました。私はJettyとJavaの組み合わせの多くのバージョンを試しました。私はそれがNIOバグかもしれないと思ったが、セレクターをnon-nioに変更したときに、別の場所に積み重ねられた。

Linuxでは問題がありますか?私はそれをrootとして実行しています。 ubuntuにいくつかの設定をして、待っているスレッドを強制的に弱くするように変更できますか? Pls。助けて、私はここで完全に失われています。

おかげ

答えて

0

私はAJAXが逆知っているわからないんだけど、私は、サーバーが要求を依頼する定期的な要求を送信する(実際には)、ブラウザによってユーザーのブラウザに要求を送信した場合、それがあると仮定。

ブラウザがリクエストを要求していないことがあり、サーバー側のスレッドが時折スタックされてしまうことが想像されます。

これは、使用しているJavaのバージョン、Jettyのバージョン、またはLinuxでは、nioとnon-nioのバグではありそうにありません。

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

+0

こんにちは、回答ありがとうございますが、明らかにDWRのバグではありません。私はDWRの2つの主要開発者と書いていましたが、DWRのバグではなく、おそらくJettyです。しかし、私はJettyのすべてのバージョンを試しましたが、バグはすべて同じで、Jettyフォーラム。問題は、Jettyは、継続的なmachanismのおかげで最高の解決策であるということです。スレッド数の一定の数だけコネクションを処理できます。他のWebコンテナは、接続モデルごとにスレッドを使用します。そのバグを検索し、 Linux上のNIOとJAVA 6の問題しかし、解決策はありません。 –

関連する問題