2011-10-10 42 views
2

哪裏是有內存不足的問題,我需要發佈大量消息的外部HTTP服務器我有一個問題,當沒有任何效果。我的HTTP客戶端代碼沒有超時。 可以通過使用kill -STOP暫停HTTP服務器進程(撤消,使用kill -CONT)來重現此行爲。HttpURLConnection的#setReadTimeout POST操作大的消息

我發現使用下面的代碼,如果我保持我的請求很小,整個消息被寫入輸出流和getResponseCode超時。

有了像下面這樣的大消息,代碼將寫入輸出流。我認爲我已經填充了套接字緩衝區。代碼然後永遠不會超時。

我在尋找的是一種在寫請求時控制超時的方法。

我嘗試了類似的使用Apache HttpClient的東西,並得到了類似的結果。 我試着在不同的線程中運行下面的Java代碼,並自己中斷它,但線程仍在運行。

我需要保持流的行爲,但我希望任何的想法變成我如何能夠獲取客戶端代碼超時。

感謝,

PJ

 URL url = new URL("http://unresponsive/path"); 
     HttpURLConnection conn = (HttpURLConnection)url.openConnection(); 
     conn.setDoInput(true); 
     conn.setDoOutput(true); 
     conn.setUseCaches(false); 
     conn.setConnectTimeout(10000); 
     conn.setFixedLengthStreamingMode(4 * 1000000); 
     conn.setRequestProperty("Content-Length", "4000000"); 
     conn.setReadTimeout(10000); 
     conn.setRequestMethod("POST"); 
     OutputStream os = conn.getOutputStream(); 
     for(int i = 0; i < 1000000; i++) { 
      if(i % 1000 == 0) { 
       System.out.println("write: " + i); 
      } 
      os.write("test".getBytes("us-ascii")); 
     } 
     os.close(); 
     System.out.println("response-code: " + conn.getResponseCode()); 
     InputStream is = conn.getInputStream(); 
     InputStreamReader isr = new InputStreamReader(is); 
     BufferedReader br = new BufferedReader(isr); 
     String line; 
     while((line = br.readLine()) != null) { 
      System.out.println(line); 
     } 
     is.close(); 

回答

0

似乎要打開在cnnection和寫入到輸出流....我覺得混亂的雷丁VS寫作中的作用... 。我想你不到從輸入流中讀取數據,當你的代碼是掛...所以超時將不會有任何效果搶救佔壓..

如果超時寫作的方式,你的代碼可以要這樣修復。

+0

謝謝jayunit100。據我所知,讀超時應該只適用於反應的讀數,但有一個設置寫入超時沒有方法。我已經設置了連接超時,但這也沒有幫助。 –