Solved

uncaught SocketTimeoutException issue

Posted on 2011-09-23
23
321 Views
Last Modified: 2012-05-12
Hello,

Here is a sample code snippet:

                    try {
                        getModel().refreshFilters();
                        success = true;
                    } catch (IOException ioe) {
                        handleException(getView(), ioe, "Problem refreshing filter data.");
                    }

When running this code, my application throws an exception:

Caused by: java.net.SocketTimeoutException: Read timed out
      at com.gepower.d400.communication.SyncRequest.execute(SyncRequest.java:149)
      at com.gepower.d400.communication.SyncRequest.execute(SyncRequest.java:143)
      at com.gepower.d400.communication.SyncRequest.execute(SyncRequest.java:111)

Shouldn't the SocketTimeoutException which is a sub-class of IOException be caught ?

Paolo
0
Comment
Question by:ptreves
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 10
  • 9
  • 4
23 Comments
 
LVL 47

Expert Comment

by:for_yan
ID: 36587591
Are you sure it comes from this very place?
No methods refreshfiletern getMode are metioned.$
Add some printout ion the truy catch loop befiore calling method nd after caling
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 36591532
Please post full output
0
 

Author Comment

by:ptreves
ID: 36598621
Here is the complete stack trace:

java.io.IOException: java.net.SocketTimeoutException: Read timed out
java.io.IOException: java.net.SocketTimeoutException: Read timed out
      at com.gepower.d400.communication.database.RecordDataFilterLoader.populateRecordFilterManager(RecordDataFilterLoader.java:59)
      at com.gepower.d400.model.database.RecordFilterManager.refresh(RecordFilterManager.java:68)
      at com.gepower.d400.view.runtime.database.ReportModel.refreshFilters(ReportModel.java:493)
      at com.gepower.d400.view.runtime.database.ReportController$RefreshFiltersAction$1.doLongOperation(ReportController.java:307)
      at com.gepower.d400.swing.BusyThread.run(BusyThread.java:103)
Caused by: com.gepower.d400.communication.RequestException: java.net.SocketTimeoutException: Read timed out
      at com.gepower.d400.communication.SyncRequest.execute(SyncRequest.java:149)
      at com.gepower.d400.communication.database.RecordDataFilterLoader.populateRecordFilterManager(RecordDataFilterLoader.java:57)
      ... 4 more
Caused by: java.net.SocketTimeoutException: Read timed out
      at sun.reflect.GeneratedConstructorAccessor38.newInstance(Unknown Source)
      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
      at java.lang.reflect.Constructor.newInstance(Unknown Source)
      at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source)
      at java.security.AccessController.doPrivileged(Native Method)
      at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown Source)
      at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
      at java.net.HttpURLConnection.getResponseCode(Unknown Source)
      at com.gepower.d400.communication.SyncRequest.execute(SyncRequest.java:143)
      ... 5 more
Caused by: java.net.SocketTimeoutException: Read timed out
      at java.net.SocketInputStream.socketRead0(Native Method)
      at java.net.SocketInputStream.read(Unknown Source)
      at java.io.BufferedInputStream.fill(Unknown Source)
      at java.io.BufferedInputStream.read1(Unknown Source)
      at java.io.BufferedInputStream.read(Unknown Source)
      at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
      at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
      at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
      at java.net.HttpURLConnection.getResponseCode(Unknown Source)
      at com.gepower.d400.communication.SyncRequest.execute(SyncRequest.java:111)
      ... 5 more
0
Optimize your web performance

What's in the eBook?
- Full list of reasons for poor performance
- Ultimate measures to speed things up
- Primary web monitoring types
- KPIs you should be monitoring in order to increase your ROI

 
LVL 86

Expert Comment

by:CEHJ
ID: 36598646
>>Shouldn't the SocketTimeoutException which is a sub-class of IOException be caught ?

The result you're expecting will only happen if  no exceptions in threads other than the one executing your code occur. It's possibly fortunate for you, since you now have a proper stack trace to help you diagnose the actual cause of the problem, which could possibly be due to a network issue
0
 

Author Comment

by:ptreves
ID: 36598866
The problem occurs randomly after a series of "Clear Logs" / "Refresh Filters" commands.
I get the impression that the exception is not caught for some reason.
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 36599103
>>I get the impression that the exception is not caught for some reason.

See my first sentence in http:#36598646
0
 

Author Comment

by:ptreves
ID: 36601779
Here is what I think the problem could be:

Both RequestException and ResponseException extend directly from the Exception calls. Here is an example for the Request Exception :

public class RequestException extends Exception{
    public RequestException(String message){
        super(message);
    }

    public RequestException(Exception e){
        super(e);        
    }
}

Here is a relationship hierarchy of the different exceptions:
Exception - RequestException
Exception - ResponseException
Exception - IOException - SocketTimeoutException

Looking through the code based on the StackTrace, I noted the following code snippet:
from line 111 in SyncRequest. java:

            int statusCode = connection.getResponseCode();

From line 143 in SyncRequest.java (connection.getResponseCode()):
            try {
                if (connection != null && connection.getResponseCode() != -1) {
                    throw new ResponseException(connection.getResponseCode(), getErrorMessage(connection), errorBody );
                } else {
                    throw new RequestException(e);
                }
            } catch (IOException ioe) {
                throw new RequestException(ioe);
            }


It seems that the method calls:

            int statusCode = connection.getResponseCode();

are throwing the exception. The execute method signature is the following:

    public void execute() throws RequestException, ResponseException {

All method calls to:             int statusCode = connection.getResponseCode();
are wrapped aroung and IOException in a catch block which you would expect to catch any sub-exception like
SocketTimeoutException

Maybe that would be the fix ?

Paolo
0
 
LVL 47

Expert Comment

by:for_yan
ID: 36601924

I understand that this exception
Caused by: com.gepower.d400.communication.RequestException: java.net.SocketTimeoutException: Read timed out

would not be caught by catch(IOException) because RequestException does not inherit from IOException

but I still don't understand why this exception

java.io.IOException: java.net.SocketTimeoutException: Read timed out

would not be caught?

When you are writing your own exceptions

RequestException and ResponseException - can't you extend these from IOExceptiion rather than Exception ?



0
 
LVL 86

Expert Comment

by:CEHJ
ID: 36602228
Could you please post the full code for the method handleException?
0
 

Author Comment

by:ptreves
ID: 36709102


    /**
     * Shows a modal <code>ErrorDialog</code> with the Application Error title over the specified parent
     * with the specified message, and exception.
     * <p/>
     * This method is thread safe, although most Swing methods are not.
     *
     * @param parent    - parent to display dialog over
     * @param exception - exception to show stack of
     * @param message   - message to display to user
     */
    public void handleException(Component parent, Throwable exception, String message) {
        ErrorDialog.showErrorDialog(parent, exception, message);
    }

0
 
LVL 86

Expert Comment

by:CEHJ
ID: 36709409
That's slightly strange. Normally exceptions should be ... exceptional, so it's not usual to present them to the user in a dialog. You should really log them, with full stack trace.
Just to recap, is the stack trace at http:#36598621 the one that occurs?
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 36709565
>>so it's not usual to present them to the user in a dialog.

Of course the word 'not' shouldn't be present in the above ;)
0
 

Author Comment

by:ptreves
ID: 36710035
yes, that is the stack trace generated.
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 36711208
OK - forgive me for asking more questions, but i feel there's a lack of clarity here: do i take it that your goal is to solve the problem that's causing this exception?
0
 

Author Comment

by:ptreves
ID: 36712121
yes, absolutely.
0
 
LVL 86

Expert Comment

by:CEHJ
ID: 36712537
It looks like either

a. an issue with the network (eliminate that by attempting to connect to different hosts)
b. an issue with that particular server (see a.)
0
 

Author Comment

by:ptreves
ID: 36712800
I extended RequestException and ResponseException both from IOException instead of Exception.
I still got this Stack Trace:

java.io.IOException: java.net.SocketTimeoutException: Read timed out
java.io.IOException: java.net.SocketTimeoutException: Read timed out
      at com.gepower.d400.communication.database.RecordDataFilterLoader.populateRecordFilterManager(RecordDataFilterLoader.java:59)
      at com.gepower.d400.model.database.RecordFilterManager.refresh(RecordFilterManager.java:68)
      at com.gepower.d400.view.runtime.database.ReportModel.refreshFilters(ReportModel.java:493)
      at com.gepower.d400.view.runtime.database.ReportController$RefreshFiltersAction$1.doLongOperation(ReportController.java:309)
      at com.gepower.d400.swing.BusyThread.run(BusyThread.java:103)
Caused by: com.gepower.d400.communication.RequestException: java.net.SocketTimeoutException: Read timed out
      at com.gepower.d400.communication.SyncRequest.execute(SyncRequest.java:149)
      at com.gepower.d400.communication.database.RecordDataFilterLoader.populateRecordFilterManager(RecordDataFilterLoader.java:57)
      ... 4 more
Caused by: java.net.SocketTimeoutException: Read timed out
      at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
      at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
      at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
      at java.lang.reflect.Constructor.newInstance(Unknown Source)
      at sun.net.www.protocol.http.HttpURLConnection$6.run(Unknown Source)
      at java.security.AccessController.doPrivileged(Native Method)
      at sun.net.www.protocol.http.HttpURLConnection.getChainedException(Unknown Source)
      at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
      at java.net.HttpURLConnection.getResponseCode(Unknown Source)
      at com.gepower.d400.communication.SyncRequest.execute(SyncRequest.java:143)
      ... 5 more
Caused by: java.net.SocketTimeoutException: Read timed out
      at java.net.SocketInputStream.socketRead0(Native Method)
      at java.net.SocketInputStream.read(Unknown Source)
      at java.io.BufferedInputStream.fill(Unknown Source)
      at java.io.BufferedInputStream.read1(Unknown Source)
      at java.io.BufferedInputStream.read(Unknown Source)
      at sun.net.www.http.HttpClient.parseHTTPHeader(Unknown Source)
      at sun.net.www.http.HttpClient.parseHTTP(Unknown Source)
      at sun.net.www.protocol.http.HttpURLConnection.getInputStream(Unknown Source)
      at java.net.HttpURLConnection.getResponseCode(Unknown Source)
      at com.gepower.d400.communication.SyncRequest.execute(SyncRequest.java:111)
      ... 5 more

0
 
LVL 86

Expert Comment

by:CEHJ
ID: 36712826
Yes, the reason for the exception, and its cure, are nothing to do with the type of your Exception
0
 

Author Comment

by:ptreves
ID: 36713105
This bug occurs periodially when pressing a compination of the command buttons "Refresh Filters" and "Clear Logs" in rapid succession over and over again.

Maybe introducing a delay in the Command Thread such as Thread.sleep(2000); or something would allow proper packet transfer and avoid any such Exceptions ?

0
 
LVL 47

Expert Comment

by:for_yan
ID: 36713153
Maybe you could increase the timeout time?

Are you connecting in your own code - in this case you can use connect with timeout paparmeter method:
http://download.oracle.com/javase/1.4.2/docs/api/java/net/Socket.html#connect%28java.net.SocketAddress,%20int%29
0
 
LVL 86

Accepted Solution

by:
CEHJ earned 500 total points
ID: 36713362
>>Maybe introducing a delay in the Command Thread such as Thread.sleep(2000) ...

Yes, that's a possibility. Some code simply should not be executed too much in quick succession
0
 

Author Comment

by:ptreves
ID: 36718630
There is a parameter called: SO_TIMEOUT (or DEFAULT_READ_TIMEOUT)
It's value is set to: 10000.
Another parmeter called READ_TIMEOUT=60000

I adjusted the values to 30000 and 40/60000 respectivily. with some improvements.
After numerous attemps, other kinds of exceptions get generated.
0
 
LVL 47

Expert Comment

by:for_yan
ID: 36718656
>other kinds of exceptions get generated

You mean not timeout, but other kinds of exceptions ?
0

Featured Post

Revamp Your Training Process

Drastically shorten your training time with WalkMe's advanced online training solution that Guides your trainees to action.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

An old method to applying the Singleton pattern in your Java code is to check if a static instance, defined in the same class that needs to be instantiated once and only once, is null and then create a new instance; otherwise, the pre-existing insta…
Java had always been an easily readable and understandable language.  Some relatively recent changes in the language seem to be changing this pretty fast, and anyone that had not seen any Java code for the last 5 years will possibly have issues unde…
Viewers will learn about arithmetic and Boolean expressions in Java and the logical operators used to create Boolean expressions. We will cover the symbols used for arithmetic expressions and define each logical operator and how to use them in Boole…
The viewer will learn how to implement Singleton Design Pattern in Java.

627 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question