2013-07-22 55 views
2

我正在使用java中的URLConnection對象將數據發佈到遠程數據庫(通過REST)。我需要發佈很多小數據包,所以我想讓我的連接保持打開狀態,直到我確定沒有更多的新數據包要發送。但是,可能會有很長一段時間,而沒有數據包會發送。當連接斷開時,URLConnection對象返回什麼

我想知道是否URLConnection對象將被重置爲空,當連接中斷(由於例如超時)。如果是這種情況,我可以檢查對象是否爲空並重新連接。但是,如果情況並非如此,我想就如何便宜地解決此問題提出一些建議(是否有必要爲每個數據包打開和關閉連接?)。

這是我當前的代碼(沒有完全結束:)!):

public class PersistenceServiceImpl implements PersistenceService, Runnable{ 

public void activate(){ 
    new Thread(this).start(); 
} 

@Override 
public void run() { 
    LinkedBlockingQueue<JSONObject> queue = JSONQueue.getUniqueInstance(); 
    JSONObject json; 
    try { 
     final URL url = new URL(""); 
     URLConnection urlConn = null; 
     DataOutputStream printout; 
     while(true){ 
      makeConnection(url, urlConn); 
      try { 
       json = queue.take(); 
       printout = new DataOutputStream (urlConn.getOutputStream()); 
       String content = json.toString(); 
       printout.writeBytes(content); 
       printout.flush(); 
       printout.close(); 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 
     } 
    }catch(Exception e){ 

    } 
} 

public void makeConnection(URL url, URLConnection urlConn) { 
    if(urlConn == null){ 
     try { 
      urlConn = url.openConnection(); 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    }else{ 
     try { 
      urlConn.connect(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    urlConn.setDoInput(false); 
    urlConn.setDoOutput(true); 
    urlConn.setUseCaches(false); 
    urlConn.setRequestProperty("Content-Type", "application/json"); 
} 

}

編輯:

我的新的和改進的(或者我希望如此)的代碼: p:

public class PersistenceServiceImpl implements PersistenceService, Runnable{ 

public void activate(){ 
    new Thread(this).start(); 
} 

LinkedBlockingQueue<JSONObject> queue = JSONQueue.getUniqueInstance(); 
JSONObject json; 
final String urlString = new String("http://localhost/"); 
@Override 
public void run() { 
    while(true){ 
     try { 
      URL url = new URL("http://localhost:8080/RESTful"); 
      HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
      conn.setDoOutput(true); 
      conn.setRequestMethod("POST"); 
      conn.setRequestProperty("Content-Type", "application/json"); 
      json = queue.take(); 
      DataOutputStream output = new DataOutputStream(conn.getOutputStream()); 
      output.write(json.toString().getBytes("utf-8")); 
      output.flush(); 
      output.close(); 
     } catch (MalformedURLException e) { 
      System.out.println("MALFORMEDURLEXCEPTION: fout url!!"); 
      e.printStackTrace(); 
     } catch (ProtocolException e){ 
      System.out.println("PROTCOL EXCEPTION: post fout"); 
     } catch (IOException e) { 
      System.out.println("IOEXCEPTION: connection failure"); 
      e.printStackTrace(); 
     } catch (InterruptedException e) { 
      System.out.println("INTERRUPTEDEXCEPTION: queue.take() deed iets fout"); 
      e.printStackTrace(); 
     } 

回答

-1

。 。

0

會拋出一些exeption。處理它在catch(Exception e)部分。請注意,您的URLConnection實例可能會損壞但不爲空。

0

您的代碼無效,因爲它假定通過引用,這在Java中不會發生。但你不需要擔心。 HttpURLConnection已經在幕後進行連接池,直到您致電disconnect()

+0

所以我可以保持連接打開,而不必擔心超時等? – Don

+0

這個問題沒有意義。除了我的答案中指出的情況外,您對連接沒有任何控制權,所以*您*無法保持連接處於開放狀態。你應該總是擔心超時,但這是一個完全獨立的問題。 – EJP

相關問題