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

Reply via email to