[ 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: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]