欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

AsyncHttpClient KeepAliveStrategy源碼流程解讀

 更新時間:2023年12月12日 08:35:19   作者:codecraft  
這篇文章主要為大家介紹了AsyncHttpClient KeepAliveStrategy源碼流程解讀,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

本文主要研究一下AsyncHttpClient的KeepAliveStrategy

KeepAliveStrategy

org/asynchttpclient/channel/KeepAliveStrategy.java

public interface KeepAliveStrategy {

  /**
   * Determines whether the connection should be kept alive after this HTTP message exchange.
   *
   * @param ahcRequest    the Request, as built by AHC
   * @param nettyRequest  the HTTP request sent to Netty
   * @param nettyResponse the HTTP response received from Netty
   * @return true if the connection should be kept alive, false if it should be closed.
   */
  boolean keepAlive(Request ahcRequest, HttpRequest nettyRequest, HttpResponse nettyResponse);
}
KeepAliveStrategy接口定義了keepAlive方法用于決定是否對該connection進行keep alive

DefaultKeepAliveStrategy

org/asynchttpclient/channel/DefaultKeepAliveStrategy.java

/**
 * Connection strategy implementing standard HTTP 1.0/1.1 behavior.
 */
public class DefaultKeepAliveStrategy implements KeepAliveStrategy {

  /**
   * Implemented in accordance with RFC 7230 section 6.1 https://tools.ietf.org/html/rfc7230#section-6.1
   */
  @Override
  public boolean keepAlive(Request ahcRequest, HttpRequest request, HttpResponse response) {
    return HttpUtil.isKeepAlive(response)
            && HttpUtil.isKeepAlive(request)
            // support non standard Proxy-Connection
            && !response.headers().contains("Proxy-Connection", CLOSE, true);
  }
}
DefaultKeepAliveStrategy實現(xiàn)了KeepAliveStrategy接口,其keepAlive方法判根據(jù)HTTP 1.0/1.1協(xié)議的規(guī)定進行判斷,需要request、response都是keep alive,且response header不包含Proxy-Connection: close才返回true

HttpUtil

io/netty/handler/codec/http/HttpUtil.java

/**
     * Returns {@code true} if and only if the connection can remain open and
     * thus 'kept alive'.  This methods respects the value of the.
     *
     * {@code "Connection"} header first and then the return value of
     * {@link HttpVersion#isKeepAliveDefault()}.
     */
    public static boolean isKeepAlive(HttpMessage message) {
        return !message.headers().containsValue(HttpHeaderNames.CONNECTION, HttpHeaderValues.CLOSE, true) &&
               (message.protocolVersion().isKeepAliveDefault() ||
                message.headers().containsValue(HttpHeaderNames.CONNECTION, HttpHeaderValues.KEEP_ALIVE, true));
    }
isKeepAlive方法在HttpMessage沒有connection: close的header,且http協(xié)議默認keep alive或者header包含了connection: keep-alive才返回true

handleHttpResponse

org/asynchttpclient/netty/handler/HttpHandler.java

private void handleHttpResponse(final HttpResponse response, final Channel channel, final NettyResponseFuture<?> future, AsyncHandler<?> handler) throws Exception {
    HttpRequest httpRequest = future.getNettyRequest().getHttpRequest();
    logger.debug("\n\nRequest {}\n\nResponse {}\n", httpRequest, response);
    future.setKeepAlive(config.getKeepAliveStrategy().keepAlive(future.getTargetRequest(), httpRequest, response));
    NettyResponseStatus status = new NettyResponseStatus(future.getUri(), response, channel);
    HttpHeaders responseHeaders = response.headers();
    if (!interceptors.exitAfterIntercept(channel, future, handler, response, status, responseHeaders)) {
      boolean abort = abortAfterHandlingStatus(handler, status) || //
              abortAfterHandlingHeaders(handler, responseHeaders) || //
              abortAfterHandlingReactiveStreams(channel, future, handler);
      if (abort) {
        finishUpdate(future, channel, true);
      }
    }
  }
HttpHandler的handleHttpResponse方法會通過KeepAliveStrategy的keepAlive來判斷是否需要keep alive,然后寫入到NettyResponseFuture中

exitAfterHandlingConnect

org/asynchttpclient/netty/handler/intercept/ConnectSuccessInterceptor.java

public boolean exitAfterHandlingConnect(Channel channel,
                                          NettyResponseFuture<?> future,
                                          Request request,
                                          ProxyServer proxyServer) {
    if (future.isKeepAlive())
      future.attachChannel(channel, true);
    Uri requestUri = request.getUri();
    LOGGER.debug("Connecting to proxy {} for scheme {}", proxyServer, requestUri.getScheme());
    channelManager.updatePipelineForHttpTunneling(channel.pipeline(), requestUri);
    future.setReuseChannel(true);
    future.setConnectAllowed(false);
    requestSender.drainChannelAndExecuteNextRequest(channel, future, new RequestBuilder(future.getTargetRequest()).build());
    return true;
  }
exitAfterHandlingConnect方法在NettyResponseFuture的keep alive為true時執(zhí)行future.attachChannel(channel, true)

attachChannel

org/asynchttpclient/netty/NettyResponseFuture.java

public void attachChannel(Channel channel, boolean reuseChannel) {
    // future could have been cancelled first
    if (isDone()) {
      Channels.silentlyCloseChannel(channel);
    }
    this.channel = channel;
    this.reuseChannel = reuseChannel;
  }
  public boolean isReuseChannel() {
    return reuseChannel;
  }
attachChannel這里維護了reuseChannel屬性

getOpenChannel

org/asynchttpclient/netty/request/NettyRequestSender.java

private Channel getOpenChannel(NettyResponseFuture<?> future, Request request, ProxyServer proxyServer,
                                 AsyncHandler<?> asyncHandler) {
    if (future != null && future.isReuseChannel() && Channels.isChannelActive(future.channel())) {
      return future.channel();
    } else {
      return pollPooledChannel(request, proxyServer, asyncHandler);
    }
  }
  private Channel pollPooledChannel(Request request, ProxyServer proxy, AsyncHandler<?> asyncHandler) {
    try {
      asyncHandler.onConnectionPoolAttempt();
    } catch (Exception e) {
      LOGGER.error("onConnectionPoolAttempt crashed", e);
    }
    Uri uri = request.getUri();
    String virtualHost = request.getVirtualHost();
    final Channel channel = channelManager.poll(uri, virtualHost, proxy, request.getChannelPoolPartitioning());
    if (channel != null) {
      LOGGER.debug("Using pooled Channel '{}' for '{}' to '{}'", channel, request.getMethod(), uri);
    }
    return channel;
  }
getOpenChannel先判斷NettyResponseFuture是否是reuse的,以及是否active,若是則直接返回future.channel(),否則通過pollPooledChannel從連接池中獲取

小結(jié)

AsyncHttpClient的KeepAliveStrategy定義了keepAlive方法用于決定是否對該connection進行keep alive;HttpHandler的handleHttpResponse方法會通過KeepAliveStrategy的keepAlive來判斷是否需要keep alive,然后寫入到NettyResponseFuture中;getOpenChannel先判斷NettyResponseFuture是否是reuse的,以及是否active,若是則直接返回future.channel(),否則通過pollPooledChannel從連接池中獲取。

以上就是AsyncHttpClient KeepAliveStrategy源碼流程解讀的詳細內(nèi)容,更多關(guān)于AsyncHttpClient KeepAliveStrategy的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java獲取視頻時長及截取幀截圖詳解

    Java獲取視頻時長及截取幀截圖詳解

    這篇文章主要介紹了Java獲取視頻時長及截取幀截圖詳解,以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。,需要的朋友可以參考下
    2019-06-06
  • mybatis項目兼容mybatis-plus問題

    mybatis項目兼容mybatis-plus問題

    這篇文章主要介紹了mybatis項目兼容mybatis-plus問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • spring打包到jar包的問題解決

    spring打包到jar包的問題解決

    這篇文章主要給大家介紹了關(guān)于spring打包到jar包遇到的問題的解決方法,文中通過實例代碼結(jié)束的非常詳細,對大家的學習或者使用spring打包具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2020-08-08
  • Hibernate原理及應用

    Hibernate原理及應用

    本文主要介紹了Hibernate原理及應用。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • Spring?Data?JPA注解Entity使用示例詳解

    Spring?Data?JPA注解Entity使用示例詳解

    這篇文章主要為大家介紹了Spring?Data?JPA注解Entity使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Spring中屬性注入詳解

    Spring中屬性注入詳解

    這篇文章主要為大家詳細介紹了Spring中屬性注入,演示了int、String、數(shù)組、list等屬性的注入,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • 關(guān)于spring中事務的傳播機制

    關(guān)于spring中事務的傳播機制

    這篇文章主要介紹了關(guān)于spring中事務的傳播機制,所謂事務傳播機制,也就是在事務在多個方法的調(diào)用中是如何傳遞的,是重新創(chuàng)建事務還是使用父方法的事務,需要的朋友可以參考下
    2023-05-05
  • Java實現(xiàn)簡單訂餐系統(tǒng)

    Java實現(xiàn)簡單訂餐系統(tǒng)

    這篇文章主要為大家詳細介紹了Java實現(xiàn)簡單訂餐系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • SpringBoot項目中分頁插件PageHelper無效的問題及解決方法

    SpringBoot項目中分頁插件PageHelper無效的問題及解決方法

    這篇文章主要介紹了解決SpringBoot項目中分頁插件PageHelper無效的問題,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-06-06
  • Java后端學習精華之TCP通信傳輸協(xié)議詳解

    Java后端學習精華之TCP通信傳輸協(xié)議詳解

    TCP/IP是一種面向連接的、可靠的、基于字節(jié)流的傳輸層通信協(xié)議,它會保證數(shù)據(jù)不丟包、不亂序。TCP全名是Transmission Control Protocol,它是位于網(wǎng)絡OSI模型中的第四層
    2021-09-09

最新評論