pandajc 2017-10-28 00:59 采纳率: 0%
浏览 3619

HttpClient IdleConnectionEvictor类关闭失效连接原理

新手一枚,对该类多线程的运行原理不是很懂,为什么要用多线程,该类在spring ioc容器中注册,是单例的,为什么要加锁?谢谢

public class IdleConnectionEvictor extends Thread{

 private final HttpClientConnectionManager connMgr;

 private volatile boolean shutdown;

 public IdleConnectionEvictor(HttpClientConnectionManager connMgr) {
     this.connMgr = connMgr;
     this.start();//刚创建就启动线程
 }

 @Override
 public void run() {
     try {
         while (!shutdown) {
             synchronized (this) {
                 wait(5000);
                 // 关闭失效的连接
                 connMgr.closeExpiredConnections();
             }
         }
     } catch (InterruptedException ex) {
         // 结束
     }
 }

 public void shutdown() {
     shutdown = true;
     synchronized (this) {
         notifyAll();
     }
 }

}



<bean id="connectionManager"
    class="org.apache.http.impl.conn.PoolingHttpClientConnectionManager">
    <!-- 设置最大连接数 -->
    <property name="maxTotal" value="${httpclient.maxTotal}"></property>
    <!-- 设置每个主机地址的并发数 -->
    <property name="defaultMaxPerRoute" value="${httpclient.defaultMaxPerRoute}"></property>
</bean>

<bean id="httpClientBuilder" class="org.apache.http.impl.client.HttpClientBuilder">
    <!-- 设置连接管理器 -->
    <property name="connectionManager" ref="connectionManager"></property>
</bean>

<!-- Httpclient对象 -->
<bean id="httpClient" class="org.apache.http.impl.client.CloseableHttpClient"
    factory-bean="httpClientBuilder" factory-method="build" scope="prototype">
</bean>

<!-- 请求配置信息构建器 -->
<bean id="requestConfigBuilder" class="org.apache.http.client.config.RequestConfig.Builder">

    <!-- 创建连接的最长时间 -->
    <property name="connectTimeout" value="${httpclient.connectTimeout}" />

    <!-- 从连接池中获取到连接的最长时间 -->
    <property name="connectionRequestTimeout" value="${httpclient.connectionRequestTimeout}" />

    <!-- 数据传输的最长时间 -->
    <property name="socketTimeout" value="${httpclient.socketTimeout}" />

    <!-- 提交请求前测试连接是否可用 -->
    <property name="staleConnectionCheckEnabled" value="${httpclient.staleConnectionCheckEnabled}" />
</bean>

<!-- 设置请求配置信息 -->
<bean id="requestConfig" class="org.apache.http.client.config.RequestConfig"
    factory-bean="requestConfigBuilder" factory-method="build">
</bean>

<!-- 定时清理Connection -->
<bean id="idleConnectionEvictor" class="com.xxx.front.httpclient.IdleConnectionEvictor"
    destroy-method="shutdown"><!-- 销毁的方法 -->
    <constructor-arg index="0" ref="connectionManager" />
</bean>

  • 写回答

1条回答 默认 最新

  • devmiao 2017-10-28 01:09
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考
  • ¥15 名为“Product”的列已属于此 DataTable
  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题