hc-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Arnaud Masson (JIRA)" <j...@apache.org>
Subject [jira] Commented: (HTTPCLIENT-596) read() on the stream returned by HttpMethod.getResponseBodyAsStream() cannot be simply canceled with Thread.interrupt
Date Wed, 09 Aug 2006 12:24:15 GMT
    [ http://issues.apache.org/jira/browse/HTTPCLIENT-596?page=comments#action_12426904 ] 
            
Arnaud Masson commented on HTTPCLIENT-596:
------------------------------------------

Ortwin:

The code that requests aborting a composite operation don't have to know the details.
In the implementation of the background task, you can put the cleanup in a finally{} block.
It will automatically be called if the thread is interrupted (that's why I consider the interrupt()
method as "safe").
try {
   httpClient client = ...
   client.execute(method);
    ...
}
finally {
   // error *or interrupted*
   // do the cleanup: rollback transactions, free resources correctly, shutdown channels...
}
In fact the finally{} block may already exist for normal error handling.

Why Thread pools are not recommended ?


Oleg,

If the http code is not directly in the Thread class, but in a nested method call, then you
have to write code like that:

class OtherClass {
  void sendMessage(String url) {
     HttpClient client = ...
     WorkerThread currentWThread = null;
     if (currentThread instanceof WorkerThread) 
         currentWThread  = (WorkerThread)currentThread;
     

     HttpMethod method1 = ...
     if (currentThread != null )
         currentWThread.setCurrentMethod(method1 );
     
     try {
         client.execute(method);
     }
     finally {
        if (currentThread != null )
            currentWThread.setCurrentMethod(null);         
     }
     ...
     HttpMethod method2 = ...
     ...
  }
}

Otherwise (if you want to avoid the cast) you must pass the WorkerThread or a special interface
to each method that may perform HTTP operations.
Moreover you don't always control the creation of the thread that call your code.


I understand that you don't want to change this in HttpClient 3.
My fix outside HttpClient works for me but I believed that other people may have the same
difficulties, especially in a swing app with long requests.
If HttpClient 4 can use NIO, it may have the behavior I am requesting, since the JDK doc says
about interrupt():
"If this thread is blocked in an I/O operation upon an interruptible channel then the channel
will be closed, the thread's interrupt status will be set, and the thread will receive a ClosedByInterruptException."
I just hope that ClosedByInterruptException will not be catched and ignored.
Thanks!

> read() on the stream returned by HttpMethod.getResponseBodyAsStream() cannot be simply
canceled with Thread.interrupt
> ---------------------------------------------------------------------------------------------------------------------
>
>                 Key: HTTPCLIENT-596
>                 URL: http://issues.apache.org/jira/browse/HTTPCLIENT-596
>             Project: HttpComponents HttpClient
>          Issue Type: Bug
>          Components: HttpClient
>    Affects Versions: 3.0 Final, 3.0.1
>         Environment: Windows XP
>            Reporter: Arnaud Masson
>
> I have a working thread that needs to download some big file with HttpMethod.getResponseBodyAsStream().
> A swing component displays a progress indication and has a "stop" button.
> When the stop button is clicked by the user, I would like to stop the download as soon
as possible, so I call interrupt() on the working thread from the EDT, which should throw
an InterruptedException or InterruptedIOException inside the working thread.
> But the read() operation on the stream returned by HttpMethod.getResponseBodyAsStream()
is not interrupted.
> The working thread stacktrace is:
> 	SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int)  //<---------
blocking
> 	SocketInputStream.read(byte[], int, int) line: 129	
> 	BufferedInputStream.fill() line: 218	
> 	BufferedInputStream.read() line: 235	
> 	ChunkedInputStream.getChunkSizeFromInputStream(InputStream) line: 249	
> 	ChunkedInputStream.nextChunk() line: 220	
> 	ChunkedInputStream.read(byte[], int, int) line: 175	
> 	AutoCloseInputStream(FilterInputStream).read(byte[], int, int) line: 111	
> 	AutoCloseInputStream.read(byte[], int, int) line: 107	
> 	...
> I know that  the JRE SocketInputStream doesn't support interrupt() but HttpClient should
hide this problem.
> A workaround is to use request.abort() but it should be possible to cancel a thread without
knowing on what it is blocked.

-- 
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators: http://issues.apache.org/jira/secure/Administrators.jspa
-
For more information on JIRA, see: http://www.atlassian.com/software/jira

        

---------------------------------------------------------------------
To unsubscribe, e-mail: httpclient-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: httpclient-dev-help@jakarta.apache.org


Mime
View raw message