当连接断开时,URLConnection对象将返回什么

时间:2013-07-22 09:43:02

标签: java http rest post

我在java中使用URLConnection对象,将数据发布到远程数据库(通过REST)。我需要发布很多小的数据包,所以我想让我的连接保持打开,直到我确定没有更多新的数据包发送。但是,如果没有数据包发送,可能会有很长一段时间。

我想知道当连接断开时(例如因为超时)URLConnection对象是否会重置为null。如果是这种情况,我可以检查对象是否为空并重新连接。但是,如果情况并非如此,我想就如何廉价地解决这个问题提出一些建议(是否有必要为每个数据包打开和关闭连接?)。

这是我目前的代码(未完全完成!:)):

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();
        } 

3 个答案:

答案 0 :(得分:0)

会抛出一些异常。处理你的捕获(例外e)部分。请注意,您的URLConnection实例可能已损坏但不为空。

答案 1 :(得分:0)

您的代码无效,因为它假定通过引用传递,这在Java中不会发生。但你不必担心它。 HttpURLConnection已在幕后进行连接池,直到您拨打disconnect()

答案 2 :(得分:-1)