我在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();
}
答案 0 :(得分:0)
会抛出一些异常。处理你的捕获(例外e)部分。请注意,您的URLConnection实例可能已损坏但不为空。
答案 1 :(得分:0)
您的代码无效,因为它假定通过引用传递,这在Java中不会发生。但你不必担心它。 HttpURLConnection
已在幕后进行连接池,直到您拨打disconnect()
。
答案 2 :(得分:-1)
。