我正在使用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();
}
所以我可以保持連接打開,而不必擔心超時等? – Don
這個問題沒有意義。除了我的答案中指出的情況外,您對連接沒有任何控制權,所以*您*無法保持連接處於開放狀態。你應該總是擔心超時,但這是一個完全獨立的問題。 – EJP