美文网首页
异步请求入门:利用ajax测试效果,设置tomcat最大的线程数

异步请求入门:利用ajax测试效果,设置tomcat最大的线程数

作者: 在路上phper | 来源:发表于2018-03-23 16:43 被阅读201次
    image.png
    上节课我们做了一个用户的Controller并且得到了用户的详细信息和用户列表
    这部分内容都是我们写死的 并且都是静态的数据
    接下来我们模拟一下比较耗时的操作(比如操作数据库 操作其他服务的接口)调用的时候都会出现一些延时
    为了演示简单 我们这里使用sleep方法对我们操作进行延时的模拟
    接下来我们写下代码
    比如我们要增加用户
    首先我们在userInfo里面加入toString的重载方法
    image.png
    接下来在UsersController中写增加用户的api
    image.png
    写完后我们重新编译代码
    用火狐带的插件测试接口(为了演示火狐插件跨域问题 我这里将context-spring.xml中全局配置 跨域请求设置允许所有域名访问了)
    如下
    image.png
    *表示不限制域名 把上节课的8999端口配置注释掉了
    设置contype
    image.png
    body中参数和我们userInfo实体类字段一致如下
    image.png
    点击send
    image.png
    可以看见圆圈在转 因为有3s延时
    3s后结果如下
    image.png
    下面我们思考下 这样的话是否会有问题 因为我们在实际网站运行过程当中很可能一个请求处理数据库或其余的业务都会造成一定时间的卡顿 这时会不会让我们的服务器出现无法响应或无法请求 肯定会有这种情况
    其中有一种情况,下面我们看张图
    image.png
    实际上tomcat内部是一个多线程处理请求的一个过程 当浏览器发出一个request请求时 tomcat会专门给一个线程来处理这个请求 处理过程中如果代码里面有比较耗时的操作(数据库操作或其他操作)会阻塞当前的线程 也就是说这时 当前线程是不能接受其他浏览器发起的request请求,如果再有一个其他浏览器发起request请求 要么由其他线程来处理新的请求 要么如果线程不够了 就剩之前的那一个线程的话,那么这个请求必须进入等待的队伍 因此我们需要使用异步的过程
    异步过程大致如下
    image.png
    比如说浏览器发起请求 这时tomcat的线程可以把相关的任务操作(比如数据库操作部分)交给另外一个单独线程来处理,此时当前线程就不会阻塞,如果此时再来一个浏览器请求,他就可以继续处理里面的过程,然后单独线程处理好之后,启用一个回调线程,把里面的数据响应给我们的客户端(浏览器端) 我们使用这种单独线程(实际上还可以设置一些线程池)对我们的tomcat(或者其他web服务器)可以起到提高吞吐量的过程
    下面看下代码
    image.png
    spring里面对异步是如何支持的
    看下文档
    https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#mvc-ann-async
    spring5.0文档说明如下
    image.png
    servlet3以后 Spring3.2就支持了异步请求 处理我们业务逻辑 当我们返回值的时候 需要返回Callable(其中一种) 这时我们主线程就释放掉了去处理其他的请求了 而TaskExecuter是来处理单独线程 处理好之后 这个request会回到我们servlet容器中返回给我们的客户端
    以上就是基本过程
    下面上代码
    image.png
    首先我们要在webapp的WEB-INF下面的web.xml的servlet中加入异步支持
    web.xml中加入如下
    image.png
    接下来对代码进行异步改造
    在UsersController中
    image.png
    接下来发布运行下代码
    下面准备个test1.html文件 存放在localhost:8999域名的web服务器上
    目录如下
    image.png
    里面写如下代码
    image.png
    由于我们后端api返回的是字符串 所以需要用到response.text()
    接下来我们访问下test1.html
    image.png
    这时我们点击异步提交按钮 结果如下
    卡顿3s弹出结果(服务端提供的结果)
    image.png
    在google浏览器打开network 点击异步提交 出现如下 pending字样(3s卡顿)
    image.png
    3s后
    image.png
    弹出结果 pending也消失了(服务端处理完成之后 把响应返回给前端)
    使用异步 在我们后端web服务器端 提高了处理速度和吞吐量
    接下来我们看下 其实这样做没什么感觉 如何让自己有感觉呢
    我们首先来测试下 改下tomcat tomcat里有些参数在我们之前没有涉及到 我们可以查一下tomcat的调优设置
    比如我们今天的设置tomcat的最大线程数
    image.png
    tomcat里默认里面有200个线程对我们的请求进行处理 所以上面我们处理这种请求毫无感觉
    下面我在改造下代码(看下例子)
    修改test1.html
    image.png
    增加了以上三处
    加入了同步的按钮
    然后再java代码
    UsersController中加入如下代码
    image.png
    下面重新发布下代码
    看看新增的两个方法的区别
    首先看下前端页面
    image.png
    分别表示异步提交 同步提交有延时(后端代码sleep了3s) 和同步提交无延时
    下面看下效果
    首先点击同步无延时按钮
    image.png
    可以发现立即就弹出了窗口信息
    接下来点击同步有延时按钮
    image.png
    image.png
    延时了3s
    当我们点同步有延时按钮时 在3s内点击同步无延时按钮
    可以发现同步无延时按钮点击后立刻还能做出响应 这是因为tomcat内部默认有200个线程处理请求
    所以在我们请求数很少的情况下是没有问题的
    如果我们的请求数太多 不够了 那么就会出现问题
    怎么能不够 需要更改tomcat参数
    下面我们打开tomcat的配置文件
    image.png
    Connector里面可以加入默认参数
    加入这个参数
    image.png
    我们添加如下
    image.png
    把tomcat最大请求数 设置成了1
    当前只有一个线程 处理我们的请求
    重启下服务 查看效果
    我们点击同步无延时按钮
    image.png
    还是很快的弹出信息框
    我们在点击同步有延时按钮 3s内在点同步无延时按钮
    image.png
    可以发现页面没有响应
    3s后
    image.png
    点击确定 再次弹出信息框
    image.png
    是因为我们先点击同步有延时按钮
    tomcat的线程只有一个 所以当前线程不能处理 后来的同步无延时按钮的请求
    需要等待3s后才能执行后来的同步无延时按钮请求
    所以先弹出的是有延时的 紧接着无延时的也弹出了
    那么我们在测试下异步按钮(就不会出现上面的问题)
    我们先点击异步按钮 在点击同步无延时按钮
    因为异步也是延时了3s
    当我们点击完异步按钮 在3s内点击同步无延时按钮
    image.png
    过几秒又弹出
    image.png
    这是因为我们异步代码把刚才的线程已经释放掉了 可以用来处理新的请求

    相关文章

      网友评论

          本文标题:异步请求入门:利用ajax测试效果,设置tomcat最大的线程数

          本文链接:https://www.haomeiwen.com/subject/fwcxcftx.html