最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

解讀httpclient的validateAfterInactivity連接池狀態(tài)檢測

 更新時(shí)間:2023年11月20日 09:03:29   作者:codecraft  
這篇文章主要為大家介紹了httpclient的validateAfterInactivity連接池狀態(tài)檢測解讀*,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

本文主要研究一下httpclient的validateAfterInactivity

validateAfterInactivity

org/apache/http/pool/AbstractConnPool.java

@Contract(threading = ThreadingBehavior.SAFE_CONDITIONAL)
public abstract class AbstractConnPool<T, C, E extends PoolEntry<T, C>>
                                               implements ConnPool<T, E>, ConnPoolControl<T> {
    private final Lock lock;
    private final Condition condition;
    private final ConnFactory<T, C> connFactory;
    private final Map<T, RouteSpecificPool<T, C, E>> routeToPool;
    private final Set<E> leased;
    private final LinkedList<E> available;
    private final LinkedList<Future<E>> pending;
    private final Map<T, Integer> maxPerRoute;
    private volatile boolean isShutDown;
    private volatile int defaultMaxPerRoute;
    private volatile int maxTotal;
    private volatile int validateAfterInactivity;
    public AbstractConnPool(
            final ConnFactory<T, C> connFactory,
            final int defaultMaxPerRoute,
            final int maxTotal) {
        super();
        this.connFactory = Args.notNull(connFactory, "Connection factory");
        this.defaultMaxPerRoute = Args.positive(defaultMaxPerRoute, "Max per route value");
        this.maxTotal = Args.positive(maxTotal, "Max total value");
        this.lock = new ReentrantLock();
        this.condition = this.lock.newCondition();
        this.routeToPool = new HashMap<T, RouteSpecificPool<T, C, E>>();
        this.leased = new HashSet<E>();
        this.available = new LinkedList<E>();
        this.pending = new LinkedList<Future<E>>();
        this.maxPerRoute = new HashMap<T, Integer>();
    }
    //......
    /**
     * @return the number of milliseconds
     * @since 4.4
     */
    public int getValidateAfterInactivity() {
        return this.validateAfterInactivity;
    }
    /**
     * @param ms the number of milliseconds
     * @since 4.4
     */
    public void setValidateAfterInactivity(final int ms) {
        this.validateAfterInactivity = ms;
    }    
}
AbstractConnPool定義了validateAfterInactivity屬性,與defaultMaxPerRoute、maxTotal不同,該屬性沒有在構(gòu)造器參數(shù)中,而是提供了setter來設(shè)置

PoolingHttpClientConnectionManager

org/apache/http/impl/conn/PoolingHttpClientConnectionManager.java

@Contract(threading = ThreadingBehavior.SAFE_CONDITIONAL)
public class PoolingHttpClientConnectionManager
    implements HttpClientConnectionManager, ConnPoolControl<HttpRoute>, Closeable {
    public PoolingHttpClientConnectionManager(
        final HttpClientConnectionOperator httpClientConnectionOperator,
        final HttpConnectionFactory<HttpRoute, ManagedHttpClientConnection> connFactory,
        final long timeToLive, final TimeUnit timeUnit) {
        super();
        this.configData = new ConfigData();
        this.pool = new CPool(new InternalConnectionFactory(
                this.configData, connFactory), 2, 20, timeToLive, timeUnit);
        this.pool.setValidateAfterInactivity(2000);
        this.connectionOperator = Args.notNull(httpClientConnectionOperator, "HttpClientConnectionOperator");
        this.isShutDown = new AtomicBoolean(false);
    }
    /**
     * Defines period of inactivity in milliseconds after which persistent connections must
     * be re-validated prior to being {@link #leaseConnection(java.util.concurrent.Future,
     *   long, java.util.concurrent.TimeUnit) leased} to the consumer. Non-positive value passed
     * to this method disables connection validation. This check helps detect connections
     * that have become stale (half-closed) while kept inactive in the pool.
     *
     * @see #leaseConnection(java.util.concurrent.Future, long, java.util.concurrent.TimeUnit)
     *
     * @since 4.4
     */
    public void setValidateAfterInactivity(final int ms) {
        pool.setValidateAfterInactivity(ms);
    }
    //......
}
PoolingHttpClientConnectionManager默認(rèn)設(shè)置pool的validateAfterInactivity為2000ms,另外也提供了setValidateAfterInactivity方法

lease

org/apache/http/pool/AbstractConnPool.java

/**
     * {@inheritDoc}
     * <p>
     * Please note that this class does not maintain its own pool of execution
     * {@link Thread}s. Therefore, one <b>must</b> call {@link Future#get()}
     * or {@link Future#get(long, TimeUnit)} method on the {@link Future}
     * returned by this method in order for the lease operation to complete.
     */
    @Override
    public Future<E> lease(final T route, final Object state, final FutureCallback<E> callback) {
        Args.notNull(route, "Route");
        Asserts.check(!this.isShutDown, "Connection pool shut down");
        return new Future<E>() {
            private final AtomicBoolean cancelled = new AtomicBoolean(false);
            private final AtomicBoolean done = new AtomicBoolean(false);
            private final AtomicReference<E> entryRef = new AtomicReference<E>(null);
            @Override
            public boolean cancel(final boolean mayInterruptIfRunning) {
                if (done.compareAndSet(false, true)) {
                    cancelled.set(true);
                    lock.lock();
                    try {
                        condition.signalAll();
                    } finally {
                        lock.unlock();
                    }
                    if (callback != null) {
                        callback.cancelled();
                    }
                    return true;
                }
                return false;
            }
            @Override
            public boolean isCancelled() {
                return cancelled.get();
            }
            @Override
            public boolean isDone() {
                return done.get();
            }
            @Override
            public E get() throws InterruptedException, ExecutionException {
                try {
                    return get(0L, TimeUnit.MILLISECONDS);
                } catch (final TimeoutException ex) {
                    throw new ExecutionException(ex);
                }
            }
            @Override
            public E get(final long timeout, final TimeUnit timeUnit) throws InterruptedException, ExecutionException, TimeoutException {
                for (;;) {
                    synchronized (this) {
                        try {
                            final E entry = entryRef.get();
                            if (entry != null) {
                                return entry;
                            }
                            if (done.get()) {
                                throw new ExecutionException(operationAborted());
                            }
                            final E leasedEntry = getPoolEntryBlocking(route, state, timeout, timeUnit, this);
                            if (validateAfterInactivity > 0)  {
                                if (leasedEntry.getUpdated() + validateAfterInactivity <= System.currentTimeMillis()) {
                                    if (!validate(leasedEntry)) {
                                        leasedEntry.close();
                                        release(leasedEntry, false);
                                        continue;
                                    }
                                }
                            }
                            if (done.compareAndSet(false, true)) {
                                entryRef.set(leasedEntry);
                                done.set(true);
                                onLease(leasedEntry);
                                if (callback != null) {
                                    callback.completed(leasedEntry);
                                }
                                return leasedEntry;
                            } else {
                                release(leasedEntry, true);
                                throw new ExecutionException(operationAborted());
                            }
                        } catch (final IOException ex) {
                            if (done.compareAndSet(false, true)) {
                                if (callback != null) {
                                    callback.failed(ex);
                                }
                            }
                            throw new ExecutionException(ex);
                        }
                    }
                }
            }
        };
    }
AbstractConnPool的lease方法返回一個(gè)future,其get方法通過getPoolEntryBlocking(route, state, timeout, timeUnit, this)獲取leasedEntry,之后判斷validateAfterInactivity是否大于0,大于0則判斷l(xiāng)easedEntry.getUpdated()+validateAfterInactivity是否小于等于當(dāng)前時(shí)間,是則執(zhí)行validate方法,validate不通過則close該entry然后release,然后繼續(xù)循環(huán)執(zhí)行g(shù)etPoolEntryBlocking

validate

org/apache/http/impl/conn/CPool.java

protected boolean validate(final CPoolEntry entry) {
        return !entry.getConnection().isStale();
    }
CPool的validate則是通過entry.getConnection().isStale()來判斷

isStale

org/apache/http/impl/AbstractHttpClientConnection.java

public boolean isStale() {
        if (!isOpen()) {
            return true;
        }
        if (isEof()) {
            return true;
        }
        try {
            this.inBuffer.isDataAvailable(1);
            return isEof();
        } catch (final SocketTimeoutException ex) {
            return false;
        } catch (final IOException ex) {
            return true;
        }
    }
AbstractHttpClientConnection的isStale先判斷是否open,再判斷是否eof,最后執(zhí)行inBuffer.isDataAvailable(1),出現(xiàn)SocketTimeoutException返回false,出現(xiàn)IOException返回true,若沒有異常返回isEof

小結(jié)

apache的httpclient的AbstractConnPool提供了validateAfterInactivity屬性,默認(rèn)是2000ms,它的作用是在連接池獲取連接的時(shí)候進(jìn)行判斷,如果該entry的最后更新時(shí)間+validateAfterInactivity小于等于當(dāng)前時(shí)間,則執(zhí)行validate方法,validate不通過則繼續(xù)循環(huán)獲取連接。而validate方法則是通過connection的isStale來判斷的。該屬性有助于檢測連接池中空閑連接的stale(half-closed)狀態(tài),避免真正使用的時(shí)候報(bào)錯(cuò)。

以上就是httpclient的validateAfterInactivity連接池狀態(tài)檢測的詳細(xì)內(nèi)容,更多關(guān)于httpclient validateAfterInactivity的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java實(shí)現(xiàn)bmp和jpeg圖片格式互轉(zhuǎn)

    Java實(shí)現(xiàn)bmp和jpeg圖片格式互轉(zhuǎn)

    本文主要介紹了Java實(shí)現(xiàn)bmp和jpeg圖片格式互轉(zhuǎn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-04-04
  • SpringCache緩存框架概述

    SpringCache緩存框架概述

    本文介紹了SpringCache緩存框架,包括其基本概念、CacheManager接口以及常用的注解如@Cacheable、@CachePut和@CacheEvict,通過這些注解,可以方便地在方法中實(shí)現(xiàn)緩存操作,提高應(yīng)用性能,感興趣的朋友跟隨小編一起看看吧
    2025-11-11
  • Java多線程基本用法總結(jié)

    Java多線程基本用法總結(jié)

    本篇文章主要總結(jié)了Java線程的一些基本的用法。具有一定的參考價(jià)值,下面跟著小編一起來看下吧
    2017-01-01
  • 淺析Java如何高效將PDF轉(zhuǎn)換為高質(zhì)量TIFF圖片

    淺析Java如何高效將PDF轉(zhuǎn)換為高質(zhì)量TIFF圖片

    在文檔處理和歸檔系統(tǒng)中,將PDF文件轉(zhuǎn)換為TIFF格式是一項(xiàng)非常常見的需求,本文將介紹如何使用Java通過Spire.PDF?for?Java庫,快速實(shí)現(xiàn)PDF到TIFF的轉(zhuǎn)換,希望對大家有所幫助
    2026-04-04
  • Java?關(guān)鍵字break和continue的使用說明

    Java?關(guān)鍵字break和continue的使用說明

    這篇文章主要介紹了Java?關(guān)鍵字break和continue的使用,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-03-03
  • springboot redis分布式鎖代碼實(shí)例

    springboot redis分布式鎖代碼實(shí)例

    這篇文章主要介紹了springboot redis分布式鎖代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-12-12
  • MyBatis實(shí)現(xiàn)分頁全過程

    MyBatis實(shí)現(xiàn)分頁全過程

    MyBatis分頁有三種方式:手動(dòng)SQL分頁(性能高但需處理數(shù)據(jù)庫差異)、RowBounds(簡單但不推薦)、PageHelper分頁插件(自動(dòng)改寫SQL,推薦生產(chǎn)環(huán)境),PageHelper適合百萬級數(shù)據(jù)優(yōu)化,是終極解決方案
    2025-08-08
  • java莫名其妙的掛掉問題及解決方案

    java莫名其妙的掛掉問題及解決方案

    文章介紹了Java服務(wù)死掉并被OOMKiller殺死的情況,通過查看系統(tǒng)日志和Cron任務(wù),懷疑存在惡意軟件,任務(wù)名稱和參數(shù)看起來隨機(jī),并且執(zhí)行用戶為root,具有高度可疑性,作者建議檢查并移除可疑任務(wù)
    2026-02-02
  • Java Optional解決空指針異??偨Y(jié)(java 8 功能)

    Java Optional解決空指針異??偨Y(jié)(java 8 功能)

    這篇文章主要介紹了Java Optional解決空指針異常總結(jié)(java 8 功能),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-11-11
  • Spring?Integration概述與怎么使用詳解

    Spring?Integration概述與怎么使用詳解

    公司項(xiàng)目需要用到spring integration,而網(wǎng)上關(guān)于spring integration的有價(jià)值的參考資料比較少,下面這篇文章主要給大家介紹了關(guān)于Spring?Integration概述與怎么使用的相關(guān)資料,需要的朋友可以參考下
    2023-02-02

最新評論

中方县| 台州市| 丰原市| 宁都县| 边坝县| 甘泉县| 高邑县| 武宁县| 越西县| 庄浪县| 夏河县| 新沂市| 化隆| 读书| 秭归县| 嵊泗县| 岳池县| 高清| 永顺县| 海南省| 凭祥市| 仲巴县| 嘉黎县| 库尔勒市| 乐安县| 大田县| 化州市| 涟水县| 虹口区| 黄石市| 井陉县| 新和县| 泊头市| 吉木萨尔县| 南漳县| 义马市| 江孜县| 河间市| 天长市| 尼木县| 札达县|