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

Oleg Kalnichevski commented on HTTPASYNC-88:
--------------------------------------------

Changgeng,
Where is a race condition here? You are getting _perfectly_ normal 
SocketTimeoutException given your very low (200 ms) timeout setting.

Oleg 

> Race condition caused SocketTimeoutException
> --------------------------------------------
>
>                 Key: HTTPASYNC-88
>                 URL: https://issues.apache.org/jira/browse/HTTPASYNC-88
>             Project: HttpComponents HttpAsyncClient
>          Issue Type: Bug
>    Affects Versions: 4.0.2
>         Environment: Linux
> Jdk1.6.0_45
>            Reporter: Changgeng Li
>
> This issue can be reproduced by following test case.
> {code}
> import org.apache.http.client.methods.HttpGet;
> import org.apache.http.client.protocol.HttpClientContext;
> import org.apache.http.impl.nio.client.CloseableHttpAsyncClient;
> import org.apache.http.impl.nio.client.HttpAsyncClients;
> import org.apache.http.impl.nio.conn.PoolingNHttpClientConnectionManager;
> import org.apache.http.impl.nio.reactor.DefaultConnectingIOReactor;
> import org.apache.http.impl.nio.reactor.IOReactorConfig;
> import org.apache.http.nio.reactor.IOReactorException;
> import org.junit.Test;
> import java.util.concurrent.ExecutionException;
> import java.util.concurrent.Future;
> import java.util.concurrent.TimeUnit;
> import java.util.concurrent.TimeoutException;
> public class AsyncClientTest {
>     @Test
>     public void testTimeout()
>             throws InterruptedException, ExecutionException, 
> TimeoutException, IOReactorException {
>         PoolingNHttpClientConnectionManager manager = new 
> PoolingNHttpClientConnectionManager(
>                 new DefaultConnectingIOReactor(buildConfig()));
>         manager.setDefaultMaxPerRoute(10);
>         manager.setMaxTotal(10);
>         CloseableHttpAsyncClient httpclient = 
> HttpAsyncClients.custom().setConnectionManager(manager).build();
>         HttpGet httpget = new HttpGet("http://localhost:8080/";);
>         HttpClientContext localContext = HttpClientContext.create();
>         httpclient.start();
>         // Pass local context as a parameter
>         for (int j = 0; j < 1000; j++) {
>             for (int i = 0; i < 5; i++) {
>                 Future<HttpResponse> future = httpclient.execute(httpget, 
> localContext, null);
>                 HttpResponse response = future.get(5000L, 
> TimeUnit.MILLISECONDS);
>                 System.out.println("Response: " + response.getStatusLine());
>                 Thread.sleep(180 + i * 10);
>             }
>         }
>     }
>     private IOReactorConfig buildConfig() {
>         final IOReactorConfig.Builder ioReactorConfigBuilder = 
> IOReactorConfig.custom();
>         ioReactorConfigBuilder.setConnectTimeout(100);
>         ioReactorConfigBuilder.setInterestOpQueued(false);
>         ioReactorConfigBuilder.setIoThreadCount(3);
>         ioReactorConfigBuilder.setSelectInterval(100);
>         ioReactorConfigBuilder.setShutdownGracePeriod(500L);
>         ioReactorConfigBuilder.setSoKeepAlive(true);
>         ioReactorConfigBuilder.setSoLinger(-1);
>         ioReactorConfigBuilder.setSoReuseAddress(false);
>         ioReactorConfigBuilder.setSoTimeout(200);
>         ioReactorConfigBuilder.setTcpNoDelay(false);
>         return ioReactorConfigBuilder.build();
>     }
> }
> {code}
> It needs a standalone webserver, for me I just start my tomcat.
> Changing the sleep time to 
> {code}
>                 Thread.sleep(181 + i * 10);
> {code}
> would make the reproduce chance much lower.
> The exception I normally got is:
> {code}
> java.util.concurrent.ExecutionException: java.net.SocketTimeoutException
>       at org.apache.http.concurrent.BasicFuture.getResult(BasicFuture.java:68)
>       at org.apache.http.concurrent.BasicFuture.get(BasicFuture.java:94)
>       at org.apache.http.AsyncClientTest.testTimeout(AsyncClientTest.java:36)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>       at 
> sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
>       at 
> org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44)
>       at 
> org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)
>       at 
> org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41)
>       at 
> org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)
>       at 
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:76)
>       at 
> org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50)
>       at org.junit.runners.ParentRunner$3.run(ParentRunner.java:193)
>       at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:52)
>       at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191)
>       at org.junit.runners.ParentRunner.access$000(ParentRunner.java:42)
>       at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:184)
>       at org.junit.runners.ParentRunner.run(ParentRunner.java:236)
>       at org.junit.runner.JUnitCore.run(JUnitCore.java:157)
>       at 
> com.intellij.junit4.JUnit4IdeaTestRunner.startRunnerWithArgs(JUnit4IdeaTestRunner.java:74)
>       at 
> com.intellij.rt.execution.junit.JUnitStarter.prepareStreamsAndStart(JUnitStarter.java:211)
>       at 
> com.intellij.rt.execution.junit.JUnitStarter.main(JUnitStarter.java:67)
>       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
>       at 
> sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
>       at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
> Caused by: java.net.SocketTimeoutException
>       at 
> org.apache.http.nio.protocol.HttpAsyncRequestExecutor.timeout(HttpAsyncRequestExecutor.java:286)
>       at 
> org.apache.http.impl.nio.client.LoggingAsyncRequestExecutor.timeout(LoggingAsyncRequestExecutor.java:121)
>       at 
> org.apache.http.impl.nio.client.InternalIODispatch.onTimeout(InternalIODispatch.java:85)
>       at 
> org.apache.http.impl.nio.client.InternalIODispatch.onTimeout(InternalIODispatch.java:37)
>       at 
> org.apache.http.impl.nio.reactor.AbstractIODispatch.timeout(AbstractIODispatch.java:172)
>       at 
> org.apache.http.impl.nio.reactor.BaseIOReactor.sessionTimedOut(BaseIOReactor.java:255)
>       at 
> org.apache.http.impl.nio.reactor.AbstractIOReactor.timeoutCheck(AbstractIOReactor.java:493)
>       at 
> org.apache.http.impl.nio.reactor.BaseIOReactor.validate(BaseIOReactor.java:205)
>       at 
> org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:281)
>       at 
> org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:105)
>       at 
> org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:584)
>       at java.lang.Thread.run(Thread.java:662)
> {code}



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to