okhttp系列-一些上限值

1.正在执行的任务数量最大值是64

异步请求放入readyAsyncCalls后,遍历readyAsyncCalls取出任务去执行的时候,如果发现runningAsyncCalls的数量大于等于64,就不从readyAsyncCalls取出任务执行。

java 复制代码
public final class Dispatcher {
    private int maxRequests = 64;

    private final Deque<AsyncCall> runningAsyncCalls = new ArrayDeque<>();

    private boolean promoteAndExecute() {
    assert (!Thread.holdsLock(this));

    List<AsyncCall> executableCalls = new ArrayList<>();
    boolean isRunning;
    synchronized (this) {
      for (Iterator<AsyncCall> i = readyAsyncCalls.iterator(); i.hasNext(); ) {
        AsyncCall asyncCall = i.next();
        //如果超过了最大数目
        if (runningAsyncCalls.size() >= maxRequests) break; // Max capacity.

        if (asyncCall.callsPerHost().get() >= maxRequestsPerHost) continue; // Host max capacity.
        //从readyAsyncCalls remove
        i.remove();

        //callsPerHost+1
        asyncCall.callsPerHost().incrementAndGet();
        //添加到executableCalls
        executableCalls.add(asyncCall);
        //添加到runningAsyncCalls
        runningAsyncCalls.add(asyncCall);
      }
      isRunning = runningCallsCount() > 0;
    }

    for (int i = 0, size = executableCalls.size(); i < size; i++) {
      AsyncCall asyncCall = executableCalls.get(i);
      //执行
      asyncCall.executeOn(executorService());
    }

    return isRunning;
  }
}

2.同一个主机的最大连接数为5

异步请求放入readyAsyncCalls后,遍历readyAsyncCalls取出任务去执行的时候,如果发现asyncCall的callsPerHost大于等于5,就不从readyAsyncCalls取出任务执行;否则callsPerHost加1。

java 复制代码
public final class Dispatcher {
    private int maxRequestsPerHost = 5; //默认5。这是okhttp对同一主机允许的最大请求数量。

    void enqueue(AsyncCall call) {
        synchronized (this) {
            readyAsyncCalls.add(call);

            //Mutate the AsyncCall so that it shares the AtomicInteger 
            //of an existing running call to the same host.
            if (!call.get().forWebSocket) {
                //从已经存在的任务里面找同一个主机的任务
                AsyncCall existingCall = findExistingCallWithHost(call.host());
                if (existingCall != null) {
                    //call的将callsPerHost赋值为existingCall的callsPerHost
                    call.reuseCallsPerHostFrom(existingCall);
                }
            }
        }
        promoteAndExecute();
    }

    //有个疑问,这里是不是要从ArrayDeque尾向前获取,才能获取到最新的AsyncCall,这样获取到的
    //callsPerHost才会是最大的?
    //目前从头开始获取,是不是有问题?
    //先从runningAsyncCalls找,再从readyAsyncCalls找
    @Nullable 
    private AsyncCall findExistingCallWithHost(String host) {
        for (AsyncCall existingCall : runningAsyncCalls) {
            if (existingCall.host().equals(host)) {
                return existingCall;
            }
        }
        for (AsyncCall existingCall : readyAsyncCalls) {
            if (existingCall.host().equals(host)) {
                return existingCall;
            }
        }
        return null;
    }
}
相关推荐
C1829818257521 小时前
HttpURLConnection 是 Apache HttpClient 和 OKHttp 底层吗
okhttp·apache
C182981825751 天前
restTemplate/Feign(Spring Cloud)或OKHttp Apache HttpClient 这几个关系与底层实现
spring cloud·okhttp·apache
码到成功>_<3 天前
使用OkHttp实现接口调用
okhttp
maycho1234 天前
裂隙瓦斯模型的Comsol模拟之旅
okhttp
chilavert31811 天前
技术演进中的开发沉思-235 Ajax:动态数据(上)
javascript·ajax·okhttp
灰什么鱼12 天前
OkHttp + Retrofit2 调用第三方接口完整教程(以nomad为例)
java·spring boot·okhttp·retrofit
苏打水com13 天前
第六篇:Day16-18 AJAX进阶+接口对接——实现“前后端数据交互”(对标职场“接口开发”核心需求)
css·okhttp·html·js
漏洞文库-Web安全13 天前
CTFHub XSS通关:XSS-过滤关键词 - 教程
前端·安全·web安全·okhttp·网络安全·ctf·xss
chilavert31814 天前
技术演进中的开发沉思-229 Ajax:Firefox 与 Firebug
javascript·okhttp
chilavert31815 天前
技术演进中的开发沉思-224 Ajax面向对象与框架
javascript·okhttp