java - Java Apache HTTP 客户端上的代理超时

标签 java http proxy

我在 Spring WebTemplate 上设置的代理有问题。构建 HTTP 客户端 org.apache.http.client.config.RequestConfig.Builder,我设置了超时:

- connectTimeout = 1000
- connectionRequestTimeout = 2000
- socketTimeout = 6000
- proxy = #{ T(org.apache.http.HttpHost).create('${proxyUrl}') }

接下来我使用上面的工厂 bean 到我的 HttpClientBuilder 中:

<bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder">
<property name="defaultRequestConfig">
<bean class="org.apache.http.client.config.RequestConfig" factory-bean="httpRequestConfigBuilder" factory-method="build"/>
</property>
</bean>

并设置 WebTemplate messageSender:

<property name="messageSender">
<bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender">
<constructor-arg>
<bean class="org.apache.http.impl.client.DefaultHttpClient" factory-bean="httpClientBuilder" factory-method="build" />
</constructor-arg>
</bean>
</property>

和网页模板

<bean class="org.springframework.ws.client.core.WebServiceTemplate">
    <constructor-arg>
        <bean class="org.springframework.ws.soap.saaj.SaajSoapMessageFactory">
            <property name="soapVersion">
                <util:constant static-field="org.springframework.ws.soap.SoapVersion.SOAP_11" />
            </property>
        </bean>
    </constructor-arg>
    <property name="defaultUri" value="${endpoint.url}" />
    <property name="messageSender">
        <bean class="org.springframework.ws.transport.http.HttpComponentsMessageSender">
            <constructor-arg>
                <bean class="org.apache.http.impl.client.DefaultHttpClient" factory-bean="httpClientBuilder" factory-method="build" />
            </constructor-arg>
        </bean>
    </property>
</bean>

我的问题是,虽然我将超时设置为 1、2 和 6 秒,但由于代理的原因,需要 75 秒才能返回错误(很可能来自代理,网络不可用)。

如果我删除代理,连接将按预期超时。

有没有办法强制使用代理超时为 1 秒?在 JEE 容器上运行,因此不能选择生成另一个线程。

最佳答案

原来是因为这个bug: https://issues.apache.org/jira/browse/HTTPCLIENT-1478

添加 SocketConfig 后,就会遵守超时:

<bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder">
     …….
   <property name="defaultSocketConfig" >
        <bean class="org.apache.http.config.SocketConfig" factory-bean="socketConfigBuilder" factory-method="build"/>
    </property>
</bean>

<bean id="socketConfigBuilder" class="org.apache.http.config.SocketConfig.Builder">
    <property name="soTimeout" value="${connect_timeout}"/>
</bean>

关于java - Java Apache HTTP 客户端上的代理超时,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57435048/

相关文章:

java - 模取什么变量类型?

java - 使用 Spring Integration 和 Spring Boot Actuator 检查 MySql 数据库的健康状况

http - 如何在 ASP 中执行 HTTP POST 请求?

java - 当 Hibernate 从 4.x 升级到 5.x 以及 Spring 4.x 进行多线程时出现 ConcurrentModificationException

java - 需要java国际象棋程序的帮助

angular - 链接 HTTP promise 时如何调用 catch 方法?

python - Nginx + Gunicorn - 静态资源错误页面

PHP imap 通过代理

gradle - Gradle,无法通过代理访问在线存储库

java - 在 Java 中通过代理发送 SOAP 消息