Skip to content

Delay between RequestTimeout and ListenableFuture's completion #1686

Open
@xiaofud

Description

@xiaofud

Hi, I find the delay between RequestTimeout and the time corresponding future completes by a timeout exception is quite long. Below is my test.

version:

<dependency>
	<groupId>org.asynchttpclient</groupId>
	<artifactId>async-http-client</artifactId>
	<version>2.10.4</version>
</dependency>

test code:

@RequestMapping("/api/timeout_test")
public BaseApiResponse<Long> timeoutTest() {
    long timeout = 1000;
    try {
        Thread.sleep(timeout);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    BaseApiResponse<Long> objectBaseApiResponse = new BaseApiResponse<>();
    objectBaseApiResponse.setData(timeout);
    return objectBaseApiResponse;
}

@RequestMapping("/api/timeout")
public BaseApiResponse<String> timeout() {

    DefaultAsyncHttpClientConfig.Builder builder = new DefaultAsyncHttpClientConfig.Builder();
    builder.setConnectTimeout(5);
    AsyncHttpClient client = asyncHttpClient(builder);
    int timeout = 20;
    String url = "http://localhost:8080/api/timeout_test";

    BaseApiResponse<String> response = new BaseApiResponse<>();
    RequestBuilder requestBuilder = new RequestBuilder();
    Request request = requestBuilder.setUrl(url).setRequestTimeout(timeout).build();

    long beforeFutureCreated = System.currentTimeMillis();
    ListenableFuture<Response> responseListenableFuture = client.executeRequest(request);
    long futureCreated = System.currentTimeMillis();

    responseListenableFuture.addListener(() -> {
        long futureComplete = System.currentTimeMillis();
        String msg = String.format("future creation: %s, future complete: %s", futureCreated - beforeFutureCreated, futureComplete - beforeFutureCreated);
        response.setMessage(msg);
    }, Runnable::run);
    try {
        responseListenableFuture.get();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return response;
}

result:

I tried many times, and the future complete time is always much longer than 20ms. It doesn't matter if I use a pre-created AsyncHttpClient or create a new one on each request.

{"code":0,"message":"future creation: 0, future complete: 103","data":null}
{"code":0,"message":"future creation: 0, future complete: 85","data":null}
{"code":0,"message":"future creation: 1, future complete: 87","data":null}
{"code":0,"message":"future creation: 1, future complete: 113","data":null}

log:

java.util.concurrent.TimeoutException: Request timeout to localhost/127.0.0.1:8080 after 20 ms

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions