Android 客户端请求 Tomcat 并发问题

最近在学习服务端Java Servlet,然后使用安卓客户端循环发起请求,测试一下,结果总是测试不到想要的结果.

客户端代码如下:

for (int i = 0; i < 100; i++) {
    SgLog.d("i=" + i);
    Map<String, String> params = new HashMap<>();
    params.put("startTime", "" + System.currentTimeMillis());
    SgHttp.INSTANCE.setMainThreadCallback(false).sendRequest(HttpMethod.GET, 
            "http://192.168.21.7:9999/checkVersion.do", params, new SgHttp
                    .IRequestCallback() {
        @Override
        public void success(String s) {
            SgLog.d("耗时:" + (System.currentTimeMillis() - Long.parseLong(s)));
        }

        @Override
        public void error(String s) {
            SgLog.d("请求错误:" + s);
        }
    });
}
就是简单的请求.请求方式是封装的okhttp

服务端代码如下:

public void doFilter( ServletRequest request,  ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
    System.out.println(Thread.currentThread().getName()+" 进入时间:"+System.currentTimeMillis());
    try {
        Thread.sleep(3000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
    response.getWriter().print(request.getParameter("startTime"));
}
也就是简单的等待3秒后把参数传回去.

结果就是这样

01-25 15:51:29.371 2311-2327/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3021
01-25 15:51:29.379 2311-2328/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3025
01-25 15:51:29.383 2311-2329/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3024
01-25 15:51:29.391 2311-2330/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3024
01-25 15:51:32.371 2311-2332/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:5997
01-25 15:51:32.399 2311-2324/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:6021
01-25 15:51:32.415 2311-2333/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:6031
01-25 15:51:32.427 2311-2328/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:6038
01-25 15:51:32.443 2311-2329/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:6050
01-25 15:51:35.399 2311-2330/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:9008
01-25 15:51:35.439 2311-2332/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:9045
01-25 15:51:35.471 2311-2327/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:9070
01-25 15:51:35.471 2311-2324/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:9069
01-25 15:51:35.479 2311-2333/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:9073
01-25 15:51:38.439 2311-2329/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:12029
01-25 15:51:38.475 2311-2328/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:12064
01-25 15:51:38.495 2311-2330/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:12079
01-25 15:51:38.507 2311-2332/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:12087
01-25 15:51:38.515 2311-2327/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:12091

从返回结果看出来,tomcat好像每次只处理5个请求,一开始以为是tomcat线程池问题, 各种百度谷歌.把tomcat配置文件都设置了一遍,然而都没起什么作用.正当一筹莫展的时候,朋友和我说是不是你手机设置了,一次只发5个出去,然后我查看了一下okhttp的源码,果然....... 下面是okhttp部分代码:

public final class Dispatcher {
  private int maxRequests = 65;
  private int maxRequestsPerHost = 5;
  private Runnable idleCallback;

  /** Executes calls. Created lazily. */
  private ExecutorService executorService;

  /** Ready async calls in the order they'll be run. */
  private final Deque<AsyncCall> readyAsyncCalls = new ArrayDeque<>();

  /** Running asynchronous calls. Includes canceled calls that haven't finished yet. */
  private final Deque<AsyncCall> runningAsyncCalls = new ArrayDeque<>();

  /** Running synchronous calls. Includes canceled calls that haven't finished yet. */
  private final Deque<RealCall> runningSyncCalls = new ArrayDeque<>();

  public Dispatcher(ExecutorService executorService) {
    this.executorService = executorService;
  }
有个默认值  每次最多并发5个 大哭,于是我改了一下okhttp的默认并发数 将原来的5改成了100 运行结果如下

1-25 15:57:50.019 2400-2417/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3018
01-25 15:57:50.027 2400-2418/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3024
01-25 15:57:50.043 2400-2420/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3020
01-25 15:57:50.047 2400-2419/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3034
01-25 15:57:50.051 2400-2421/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3024
01-25 15:57:50.059 2400-2422/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3026
01-25 15:57:50.063 2400-2423/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3022
01-25 15:57:50.083 2400-2424/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3035
01-25 15:57:50.103 2400-2425/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3046
01-25 15:57:50.115 2400-2427/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3036
01-25 15:57:50.123 2400-2426/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3059
01-25 15:57:50.123 2400-2429/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3036
01-25 15:57:50.123 2400-2428/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3041
01-25 15:57:50.139 2400-2430/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3043
01-25 15:57:50.143 2400-2431/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3029
01-25 15:57:50.143 2400-2432/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3027
01-25 15:57:50.159 2400-2434/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3024
01-25 15:57:50.159 2400-2433/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3038
01-25 15:57:50.167 2400-2435/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3027
01-25 15:57:50.175 2400-2436/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3024
01-25 15:57:50.179 2400-2437/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3022
01-25 15:57:50.187 2400-2438/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3025
01-25 15:57:50.199 2400-2439/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3023
01-25 15:57:50.227 2400-2440/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3041
01-25 15:57:50.231 2400-2441/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3036
01-25 15:57:50.231 2400-2442/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3033
01-25 15:57:50.239 2400-2443/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3028
01-25 15:57:50.255 2400-2444/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3038
01-25 15:57:50.263 2400-2446/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3027
01-25 15:57:50.267 2400-2447/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3027
01-25 15:57:50.271 2400-2445/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3039
01-25 15:57:50.279 2400-2448/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3032
01-25 15:57:50.283 2400-2449/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3020
01-25 15:57:50.299 2400-2450/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3026
01-25 15:57:50.315 2400-2451/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3035
01-25 15:57:50.323 2400-2453/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3026
01-25 15:57:50.327 2400-2452/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3038
01-25 15:57:50.343 2400-2454/org.z2y.sdk D/SgLog: SdkTools.java-------耗时:3040

这才是正确的结果,算是给自己上了一课吧..虽然测试方式不太科学,但总归可以体现出一些问题.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值