10

We have next code.
Sometimes we should wait 10-20-40 seconds on the last line.
What can be the problem?

Java 1.4

URL url = ...;
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
conn.setDoInput(true);
conn.setDoOutput(true);
conn.setUseCaches(false);
conn.connect();
OutputStream out = conn.getOutputStream();
ObjectOutputStream outStream = new ObjectOutputStream(out);
try
{
   outStream.writeObject(objArray);
}
finally
{
   outStream.close();
}

InputStream input = conn.getInputStream();

UPDATED:
Next code fixes the problem IN ECLIPSE.
But it still DOES NOT WORK via Java WebStart:(

HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
conn.setDoInput(true);  
conn.setDoOutput(true);  
conn.setUseCaches(false);  
System.setProperty("http.keepAlive", "false");  //<---------------
conn.connect();  

But why?

UPDATED one more time!
Bug was fixed! :)

We worked with connections not in one class but in two.
And there is following line in the second class:

URL url = ...  
HttpURLConnection conn = (HttpURLConnection) url.openConnection();  
conn.setRequestProperty("Content-Length", "1000");  //<------------
conn.connect();  

Note: setRequestProperty("Content-Length", "1000") is root cause of the problem.

Sagar Maiyad
  • 12,655
  • 9
  • 63
  • 99
Volodymyr Bezuglyy
  • 16,295
  • 33
  • 103
  • 133

6 Answers6

12

'We had a similar issue which is caused by buggy keep-alive in old Java. Add this before connect to see if it helps,

conn.setRequestProperty("Connection", "close");

or

System.setProperty("http.keepAlive", "false");
ZZ Coder
  • 74,484
  • 29
  • 137
  • 169
  • How about the 2nd approach? You really need to post a TCP dump to see exactly what the issue is. I don't think it's DNS though because which occurs in connect() call. – ZZ Coder Dec 17 '09 at 13:33
  • It seems to me that keepAlive=false helps. But why? – Volodymyr Bezuglyy Dec 17 '09 at 14:10
  • Without a trace, I am just guessing. The HTTP request has keepalive but no content-length, the server doesn't know where is the end of the request so it keeps waiting. The default timeout on Apache is 30 seconds. When keepalive is turned off, the OutputStream will be closed, which notifies the server request is done. – ZZ Coder Dec 17 '09 at 15:44
  • wireshark/ethereal, tcpdump, snoop. It really depends on your OS. – ZZ Coder Dec 17 '09 at 16:21
  • 1
    Setting the `connection=close` header should work. Maybe you didn't set the request property correctly. It should be done prior to `connect()`. Setting the system property `http.keepalive=false` does basically the same, but then as a low-level workaround. When not specified manually, the `URLConnection` uses it to set the `connection` header. That it doesn't work in webstart is simply a security restriction. But anyway, the `setRequestProperty("Connection", "close")` must work. Try again and verify if you did anything right. – BalusC Dec 17 '09 at 17:47
  • Improve the speed using https in my case, very useful – Virthuss Nov 30 '15 at 02:59
4

Had the same problem, found out it was caused by IPv6.

You Disable it from code using:

System.setProperty("java.net.preferIPv4Stack" , "true");

You can also disable it via the command line using : g-Djava.net.preferIPv4Stack=true

pieter
  • 103
  • 1
  • 7
2

Try it with an IP address. To see if it's a DNS problem.

Thomas Jung
  • 32,428
  • 9
  • 84
  • 114
2

I had same problem, so i change to HTTPClient from Apache, follow a example:

HttpClient httpClient = HttpClientBuilder.create().build();

HttpPost request = new HttpPost("www.myurl-to-read");

RequestConfig requestConfig = RequestConfig.custom()
                              .setSocketTimeout(8000)
                              .setConnectTimeout(10000)
                              .setConnectionRequestTimeout(1000)
                              .build();

request.setConfig(requestConfig);

request.setHeader("Content-type", "application/json");

HttpResponse  response = httpClient.execute(request);

HttpEntity entity = response.getEntity();
String result = EntityUtils.toString(entity, "UTF-8");
Juri Noga
  • 4,363
  • 7
  • 38
  • 51
1

The problem can be something from network sub layer... Should be hard to find it.

But what about the setReadTimeOut() with low value and a while loop?

enguerran
  • 3,193
  • 3
  • 26
  • 42
1

One thing I would guess is that your DNS server isn't responding well.

Can you experiment with changing symbolic domain names to numeric IP addresses before you start? Or can you do each request twice (just for experimentation) and see if the first request is significantly slower than the second?

Google has put up a DNS server at (among others) 8.8.8.8 . They claim it's faster than most other DNS servers. Give that a try!

Carl Smotricz
  • 66,391
  • 18
  • 125
  • 167