hc-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Ortwin Glück (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 09:16:14 GMT
    [ http://issues.apache.org/jira/browse/HTTPCLIENT-596?page=comments#action_12426880 ] 
            
Ortwin Glück commented on HTTPCLIENT-596:
-----------------------------------------

Arnaud,

Please elaborate how HttpClient could possibly notice a Thread.interrupt() call and do an
abort while the thread is blocking on a Socket.read. To my knowledge that's simply impossible,
because there is no API to register a callback on this signal.

I don't share your opinion that this "makes the code more complex and difficult to maintain".
I consider calling Thread.interrupt() from a Swing thread a rather brutal method for achieving
what you want. You can solve this problem in a more elegant fashion. If you already know that
this is a task that you want to be able to abort, then provide an API to do it. If you only
hold a reference to a Thread object, then you have a design problem: use Runnable.:

interface Abortable {
  void abort();
}

class Downloader implements Abortable, Runnable {
  HttpMethod method;
 
  public void run() {
     ...
    client.execute(method);
     ...
  }

 public void abort() {
    method.abort();
 }
}

> 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