2011-07-03 5 views
0

以下は私のコードです。私はこのコードを実行すると、常に固まってしまいます。時にはループ100回、時には3000回実行されることもあります。奇妙なことは、それがちょうど立ち往生したときのエラーを投げないということです。誰にもアイデアはありますか?URLConnectionがスタックしてエラーをスローしない

import java.io.IOException; 
import java.util.logging.Level; 
import java.util.logging.Logger; 
import us.monoid.web.Resty; 


public class Example1 { 

/** 
* @param args the command line arguments 
*/ 
public static void main(String[] args) { 

    // Allow certificates - See http://en.wikibooks.org/wiki/Programming:WebObjects/Web_Services/How_to_Trust_Any_SSL_Certificate 
    SSLUtilities.trustAllHostnames(); 
    SSLUtilities.trustAllHttpsCertificates() ; 

    // Variables 
    int i = 0; 
    String askBidURL = "https://www.exchangebitcoins.com/data/depth"; 

    while(true){ 

     System.out.println("Example 1 - Run #" + i); 
     Resty r = new Resty(); 

     try {String jsonw = r.text(askBidURL).toString();} 
     catch (IOException ex){Logger.getLogger(Example1.class.getName()).log(Level.SEVERE, null, ex); } 
     i++; 

    } 
} 
} 
+1

質問に答えるには十分な情報がありません。 URLConnectionに問題があると述べていますが、これはコード内のどこにも表示されません。また、何が起こるか?あなたが得ているエラーまたは出力は何ですか?それは何かでなければなりません、なぜなら、あなたはループをn回実行すると述べているからです...それ以降はどうなりますか? –

+0

ループがn回実行された後、ループは動かないだけです。プログラムが終了せず、例外もスローされません。同じコード行に固執しているだけです。 – FredTheLover

答えて

0

Resty.text()またはそこでの呼び出しは、データを十分に速く受け取っていない可能性があります。

HTTPURLConnectionのInputStream(途中でBufferedInputStreamを使用していても)からread()操作を実行し、バイトを徐々にStringに追加すると、このようなことが起こりました。明らかに、文字列が非常に遅く構築され、入力データに追いついていないことが原因です。そのループを最適化することで問題は解決しました。

ランダムに、100〜1000 GETで約1回発生します。それが起こったときに、たとえ外側のタイマースレッドclose()やread()のストリームと接続がスタックされていても、後で接続を妨害することになります。

推論的には、ループがInputStreamからのデータを十分に食べていないため、InputStreamのread()はゼロサイズのブロックを見ず決して終了しない場合があります。

あなたのライブラリを変更する気分はどれくらいですか...

関連する問題