Link to home
Start Free TrialLog in
Avatar of sunilramu
sunilramu

asked on

Http connection timeout

Hi Experts,
In my web application i have an user uploading a file ~10MB and i need to parse the file they uploaded and move records into database before i can respond to client. My fear is that this process can take minutes(5-10mins) and might lead in connection timeout.
Is this a valid fear? If so any ideas as to what i can do to avoid it.

thanks
S
Avatar of CEHJ
CEHJ
Flag of United Kingdom of Great Britain and Northern Ireland image

Connection timeout is not likely unless the upload gets broken in some way
Avatar of sunilramu
sunilramu

ASKER

Hi CEHJ,

Thanks! Can you please give or direct me to more details. As to why its not likely.

S
SOLUTION
Avatar of CEHJ
CEHJ
Flag of United Kingdom of Great Britain and Northern Ireland image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
CHEJ,
Do you mean no activity on the app server or web server. How does web server know that app server is still processing request. do they have open dialog when the processing is going on. i thought it was a disconnected interaction. Can you please point me to some literature as the what such a threshold(if exists) may be.

thanks again
S
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
What java code are you using on the server side for uploading?

I know on downloading you can Resume the Download if the connection times out if the server supports that (i.e., "range:bytes=" in http header) along with setting the number of milliseconds for the time out.  The pseudo-code below is an example.
URL url = new URL("http://.../file.ext");
HttpURLConnection con = (HttpURLConnection)url.openConnection();
 
con.connect();
if(destFile.exists() && destFile.length() >= con.getContentLength()) {
  return(true); //download complete
}
con.disconnect();
 
boolean appendToFile = false;
int bytesDownloadedSoFar = 0;
 
if(destFile.exists()) {
  bytesDownloadedSoFar = destFile.length();
  appendToFile = true;
 
  con.addRequestProperty("Range","bytes=" + bytesDownloadedSoFar + "-");
  //just in case
  con.setRequestProperty("Range","bytes=" + bytesDownloadedSoFar + "-");
}
 
con.setConnectTimeout(30000);
con.setReadTimeout(30000);
con.connect();
 
//Start downloading...
...

Open in new window

ASKER CERTIFIED SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Thanks all.
how do you send periodic progress updates about percentage of work done. i am using a web based app deployed on a cluster. and i need to process the file once its uploaded which takes time. i cant have user directed to another app server (becasue of clustering) by using ajax. is there anything like a staged response in servlets.

sounds like you need sticky session to ensure the progress requests go to the same server
I don't think there are staged responses as such in servlets. But you could logically implement this in a different way. Consider the following example of how you can handle your communication, keeping in mind a new thread of execution handles each request at the servlet:

Client: Sends HTTP request containing file to be uploaded

Servlet: Begins saving the file onto the server and responds with a "began download"

Client: Sends a periodic progress request

Servlet: Checks the progress (which may be set in a servlet class variable as the upload happens)and returns the same as a response.

(This continues a while till it is complete. And note that the servlet is continuously receiving the file in the process)

Client: Sends a periodic progress request

Servlet: Sends response which says "Upload complete. Processing."

(This continues till processing is done)

Client: Sends a periodic progress request

Servlet: Responds with the result of processing.

IMHO, this could be an alternative to a single request that receives the response once the processing is complete (that single request could time out if a response is not received within a set amount of time).

You could obviously refine this to prevent too much bandwidth overhead by minimizing the number of "progress requests". This could be done by responding with an approximate time to completion so the next request happens only after that duration.
nikhilmenon i like your idea.
Savant sticky sessions is not an option atleast as of yet.
has anyone familiar with or worked with Pushlets. this came up when i was looking up for more information.

thank you all.
nikhilmenon i like your idea. problem is that it will not work on cluster envt. unless status is maintained on database.
Cookies might be an option. The cookie here containing the identifier for which particular server is handling the request from this client.