聊聊jest的IdleConnectionReaper

55次阅读

共计 3879 个字符,预计需要花费 10 分钟才能阅读完成。

本文主要研究一下 jest 的 IdleConnectionReaper

IdleConnectionReaper

jest-common-6.3.1-sources.jar!/io/searchbox/client/config/idle/IdleConnectionReaper.java

public class IdleConnectionReaper extends AbstractScheduledService {final static Logger logger = LoggerFactory.getLogger(IdleConnectionReaper.class);

    private final ReapableConnectionManager reapableConnectionManager;
    private final ClientConfig clientConfig;

    public IdleConnectionReaper(ClientConfig clientConfig, ReapableConnectionManager reapableConnectionManager) {
        this.reapableConnectionManager = reapableConnectionManager;
        this.clientConfig = clientConfig;
    }

    @Override
    protected void runOneIteration() throws Exception {logger.debug("closing idle connections...");
        reapableConnectionManager.closeIdleConnections(clientConfig.getMaxConnectionIdleTime(),
                                                       clientConfig.getMaxConnectionIdleTimeDurationTimeUnit());
    }

    @Override
    protected Scheduler scheduler() {
        return Scheduler.newFixedDelaySchedule(0l,
                                               clientConfig.getMaxConnectionIdleTime(),
                                               clientConfig.getMaxConnectionIdleTimeDurationTimeUnit());
    }

    @Override
    protected ScheduledExecutorService executor() {
        final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(new ThreadFactoryBuilder()
                .setDaemon(true)
                .setNameFormat(serviceName())
                .build());
        // Add a listener to shutdown the executor after the service is stopped.  This ensures that the
        // JVM shutdown will not be prevented from exiting after this service has stopped or failed.
        // Technically this listener is added after start() was called so it is a little gross, but it
        // is called within doStart() so we know that the service cannot terminate or fail concurrently
        // with adding this listener so it is impossible to miss an event that we are interested in.
        addListener(new Listener() {@Override public void terminated(State from) {executor.shutdown();
            }
            @Override public void failed(State from, Throwable failure) {executor.shutdown();
            }}, MoreExecutors.directExecutor());
        return executor;
    }
}
  • IdleConnectionReaper 继承了 AbstractScheduledService,它的构造器接收 clientConfig 及 reapableConnectionManager;其 runOneIteration 执行了 reapableConnectionManager.closeIdleConnections;其 scheduler 方法创建的是 fixedDelay Scheduler;其 executor 方法创建的是 SingleThreadScheduledExecutor

ReapableConnectionManager

jest-common-6.3.1-sources.jar!/io/searchbox/client/config/idle/ReapableConnectionManager.java

public interface ReapableConnectionManager {void closeIdleConnections(long idleTimeout, TimeUnit unit);
}
  • ReapableConnectionManager 接口定义了 closeIdleConnections 方法

HttpReapableConnectionManager

jest-6.3.1-sources.jar!/io/searchbox/client/config/idle/HttpReapableConnectionManager.java

public class HttpReapableConnectionManager implements ReapableConnectionManager {
    private final HttpClientConnectionManager connectionManager;
    private final NHttpClientConnectionManager nConnectionManager;

    public HttpReapableConnectionManager(HttpClientConnectionManager connectionManager, NHttpClientConnectionManager nConnectionManager) {if(connectionManager == null || nConnectionManager == null) throw new IllegalArgumentException();

        this.connectionManager = connectionManager;
        this.nConnectionManager = nConnectionManager;
    }

    @Override
    public void closeIdleConnections(long idleTimeout, TimeUnit unit) {connectionManager.closeIdleConnections(idleTimeout, unit);
        nConnectionManager.closeIdleConnections(idleTimeout, unit);
    }
}
  • HttpReapableConnectionManager 实现了 ReapableConnectionManager 接口;其构造器要求输入 connectionManager 及 nConnectionManager,二者不能同时为 null;其 closeIdleConnections 方法分别执行了 connectionManager.closeIdleConnections 及 nConnectionManager.closeIdleConnections

小结

  • IdleConnectionReaper 继承了 AbstractScheduledService,它的构造器接收 clientConfig 及 reapableConnectionManager;其 runOneIteration 执行了 reapableConnectionManager.closeIdleConnections;其 scheduler 方法创建的是 fixedDelay Scheduler;其 executor 方法创建的是 SingleThreadScheduledExecutor
  • ReapableConnectionManager 接口定义了 closeIdleConnections 方法
  • HttpReapableConnectionManager 实现了 ReapableConnectionManager 接口;其构造器要求输入 connectionManager 及 nConnectionManager,二者不能同时为 null;其 closeIdleConnections 方法分别执行了 connectionManager.closeIdleConnections 及 nConnectionManager.closeIdleConnections

doc

  • IdleConnectionReaper

正文完
 0