[ 
https://issues.apache.org/jira/browse/HTTPASYNC-54?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13768143#comment-13768143
 ] 

Oleg Kalnichevski commented on HTTPASYNC-54:
--------------------------------------------

How bizarre! Anyway, given it appears to be an isolated issue there is no need 
to mount a full scale investigation at this point unless we start getting 
similar reports. 

Oleg
                
> AsyncClient.execute hangs (or extremely slow) if Future.get is invoked 
> between requests
> ---------------------------------------------------------------------------------------
>
>                 Key: HTTPASYNC-54
>                 URL: https://issues.apache.org/jira/browse/HTTPASYNC-54
>             Project: HttpComponents HttpAsyncClient
>          Issue Type: Bug
>    Affects Versions: 4.0-beta4
>         Environment: $ java -version
> java version "1.7.0_40"
> Java(TM) SE Runtime Environment (build 1.7.0_40-b43)
> Java HotSpot(TM) 64-Bit Server VM (build 24.0-b56, mixed mode)
> $ uname -a
> Darwin lgmac-bchristensen 12.5.0 Darwin Kernel Version 12.5.0: Mon Jul 29 
> 16:33:49 PDT 2013; root:xnu-2050.48.11~1/RELEASE_X86_64 x86_64
>            Reporter: Ben Christensen
>
> When executing requests in a loop, if the returned Future<HttpResponse> is 
> dereferenced by calling get() it is expected it will cause the loop to happen 
> sequentially, each request happening one at a time.
> Pseudo code (this approach does not work):
>      for 1...5
>           Future f = asyncHttpClient.execute()
>           f.get()
>       
> What actually happens is it seems to hang, or at best start taking several 
> minutes per requests as opposed to milliseconds.
> If the for-loop of requests is done completely asynchronously and the Futures 
> just collected and dereferenced after all requests are executed, then it 
> works fine.
> Pseudo code (this approach works):
>      for 1...5
>           listOfFutures << asyncHttpClient.execute()
>      for f in listOfFutures
>           f.get()
> I intend on a completely non-blocking strategy, but there are times when 
> blocking is needed, and many will use my library in that manner, so I need 
> this to work.
> Either I'm doing something very wrong, or there is indeed an issue. No amount 
> of breakpoints or debugging has led me yet to where the issue is, so sorry 
> that all I can do is provide an example of the problem and not a pointer to 
> what I think the solution is.
> Thank you in advance for your time on this matter.
> Following is code that demonstrates the issue and log output of the scenarios:
> ----------------------------------------------------------
> Code demonstrating issue:
> ----------------------------------------------------------
> import java.util.concurrent.Future;
> import org.apache.http.HttpResponse;
> import org.apache.http.client.methods.HttpGet;
> import org.apache.http.concurrent.FutureCallback;
> import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
> import org.apache.http.impl.nio.client.HttpAsyncClients;
> import org.apache.http.protocol.BasicHttpContext;
> public class TestAynscHttpClient {
>     public static void main(String args[]) {
>         CloseableHttpAsyncClient client = HttpAsyncClients.createDefault();
>         client.start();
>         try {
>             /*
>              * This should execute 5 requests asynchronously and receive 
> responses in the FutureCallback handler.
>              * 
>              * If the `f.get()` line is invoked, only the first will work, no 
> further requests will execute
>              * (or sometimes if I leave it sitting for minutes I see a second 
> request go through).
>              * 
>              * If the `f.get()` line is commented out, then all 5 correctly 
> execute and return.
>              * 
>              * It is expected that if someone calls `f.get()` in this loop it 
> should cause the requests
>              * to happen sequentially, but they should still work.
>              */
>             for (int i = 0; i < 5; i++) {
>                 System.out.println("execute request");
>                 Future<HttpResponse> f = client.execute(new 
> HttpGet("http://www.google.com";),
>                         new BasicHttpContext(), new 
> FutureCallback<HttpResponse>() {
>                             @Override
>                             public void failed(Exception ex) {
>                                 System.out.println("failed");
>                             }
>                             @Override
>                             public void completed(HttpResponse result) {
>                                 System.out.println("Result: " + result);
>                             }
>                             @Override
>                             public void cancelled() {
>                                 System.out.println("cancelled");
>                             }
>                         });
>                 try {
>                     f.get();// commenting out this line makes the 5 requests 
> succeed
>                 } catch (Exception e) {
>                     e.printStackTrace();
>                 }
>                 System.out.println("after f.get()");
>             }
>             // wait for all async tasks to complete (when f.get is commented 
> out)
>         } finally {
>             try {
>                 Thread.sleep(2000);
>                 client.close();
>             } catch (Exception e) {
>                 e.printStackTrace();
>             }
>         }
>     }
> }
> ----------------------------------------------------------
> Here is output with f.get() disabled:
> ----------------------------------------------------------
>               
> execute request
> after f.get()
> execute request
> after f.get()
> execute request
> after f.get()
> execute request
> after f.get()
> execute request
> after f.get()
> Result: HTTP/1.1 200 OK [Date: Sun, 15 Sep 2013 03:45:00 GMT, Expire... 
> cropped for brevity
> Result: HTTP/1.1 200 OK [Date: Sun, 15 Sep 2013 03:45:00 GMT, Expire... 
> cropped for brevity
> Result: HTTP/1.1 200 OK [Date: Sun, 15 Sep 2013 03:45:00 GMT, Expire... 
> cropped for brevity
> Result: HTTP/1.1 200 OK [Date: Sun, 15 Sep 2013 03:45:00 GMT, Expire... 
> cropped for brevity
> Result: HTTP/1.1 200 OK [Date: Sun, 15 Sep 2013 03:45:00 GMT, Expire... 
> cropped for brevity
>               
> ----------------------------------------------------------
> Here is output with f.get() enabled:
> ----------------------------------------------------------
> execute request
> after f.get()
> execute request
> Result: HTTP/1.1 200 OK [Date: Sun, 15 Sep 2013 03:43:47 GMT, Expire... 
> cropped for brevity
> ----------------------------------------------------------
> Here is output with f.get() enabled and letting it run
> for several minutes. Note several minutes between responses.
> ----------------------------------------------------------
>               
> execute request
> after f.get()
> execute request
> Result: HTTP/1.1 200 OK [Date: Sun, 15 Sep 2013 03:38:59 GMT, Expire... 
> cropped for brevity
> after f.get()
> execute request
> Result: HTTP/1.1 200 OK [Date: Sun, 15 Sep 2013 03:42:59 GMT, Expire... 
> cropped for brevity
> ----------------------------------------------------------
> This code also hangs on the second request:
> ----------------------------------------------------------
>         try {
>             client.execute(new HttpGet("http://www.google.com";),
>                     new BasicHttpContext(), new 
> FutureCallback<HttpResponse>() {
>                         @Override
>                         public void failed(Exception ex) {
>                             System.out.println("failed");
>                         }
>                         @Override
>                         public void completed(HttpResponse result) {
>                             System.out.println("Result: " + result);
>                         }
>                         @Override
>                         public void cancelled() {
>                             System.out.println("cancelled");
>                         }
>                     }).get();
>             
>             client.execute(new HttpGet("http://www.apple.com";),
>                     new BasicHttpContext(), new 
> FutureCallback<HttpResponse>() {
>                         @Override
>                         public void failed(Exception ex) {
>                             System.out.println("failed");
>                         }
>                         @Override
>                         public void completed(HttpResponse result) {
>                             System.out.println("Result: " + result);
>                         }
>                         @Override
>                         public void cancelled() {
>                             System.out.println("cancelled");
>                         }
>                     }).get();
>         } catch (Exception e1) {
>             e1.printStackTrace();
>         }

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscr...@hc.apache.org
For additional commands, e-mail: dev-h...@hc.apache.org

Reply via email to