使用Apache HttpClient,为什么我的连接超时不起作用?

时间:2020-03-06 14:42:42  来源:igfitidea点击:

我的httpclient实现有时在调用doGetConnection()时引发异常。但是,我有以下超时设置

_moHttpClient.setHttpConnectionFactoryTimeout(30000);

看起来我的超时几乎没有被接受。还有其他地方我需要设置超时以确保不会再次发生此行为

解决方案

HttpConnectionManagerParams cmparams = new HttpConnectionManagerParams();
    cmparams.setSoTimeout(10000);
    cmparams.setTcpNoDelay(true);
    HttpConnectionManager manager = new SimpleHttpConnectionManager();
    manager.setParams(cmparams);
    params = new HttpClientParams();
    params.setSoTimeout(5000);
    client = new HttpClient(params, manager);

我不知道为什么要设置两个不同的SoTimeouts。也许我正在尝试找出哪个实际处于活动状态,因为使用它时我遇到了与我们相同的问题。

上面的代码现在处于我们所在位置的实时代码中,但是我不能说它是否有效是因为它是正确的,还是因为Providence对我微笑(并且另一端通常总是可用)。

cmparams.setSoTimeout(10000);

默认情况下,此选项适用于所有HttpClient。

params.setSoTimeout(5000);

这是针对特定的httpclient的。

我们会抛出什么异常?

别忘了我们有两个超时时间可以更改/检查。来自HttpConnectionParams

setConnectionTimeout()
setSoTimeout()

因此,我们可以控制等待与服务器连接的时间,以及在超时之前对套接字进行的操作需要多长时间。