2017-09-27 208 views
0

我有这部分代码Apache的HTTP客户端timout问题

  RequestConfig requestConfig = RequestConfig.custom() 
         .setConnectTimeout(30 * 1000) 
         .setSocketTimeout(30 * 1000) 
         .setConnectionRequestTimeout(30 * 1000) 
         .build(); 

     BotSynch.httpClient = HttpClientBuilder.create().setDefaultRequestConfig(requestConfig).build(); 

     httpClient.execute(post); 

的BotSynch.HttpClient是一类场

private static CloseableHttpClient httpClient; 

后的最后一行是HttpPost。

我的实现到目前为止效果很好,但是如果我连接的服务器在30秒内没有回应发布请求,则不会发生任何事情。

有时最多可能需要10分钟,直到我收到服务器对请求的回答,这实际上是我试图通过上面的超时设置来防止的。

有没有我想念的东西或应该在旁边处理的事情?

+0

这个'BotSynch.httpClient'是一个正确的定义吗?你有没有试过将'httpClient'定义为'CloseableHttpClient'? – araknoid

+0

对不起,我在我的问题中加入了这个清晰的内容。它已经是一个CloseableHttpClient,是的。 – AnnaKlein

+0

请注意,就服务器套接字超时而言,如果服务器每30秒发送至少一个数据包,连接将不会触发套接字超时。 – oleg

回答

1

如果预期的行为是不应该花费超过30秒的时间而不考虑执行结果,则应该考虑在后台线程方法中使用HttpUriRequest#abort方法,该方法可能会在指定时间间隔后中止请求。

final HttpGet request = new HttpGet(); 
    ScheduledExecutorService executorService = ... 
    executorService.schedule(request::abort, (long)30, TimeUnit.SECONDS); 
    HttpResponse response = httpClient.execute(request); 

我们(包括我自己)不应该忘记这不是socketTimeout所做的。