异步请求入门:利用ajax测试效果,设置tomcat最大的线程数
2018-03-23 本文已影响201人
在路上phper
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
这是因为我们异步代码把刚才的线程已经释放掉了 可以用来处理新的请求
上节课我们做了一个用户的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
这是因为我们异步代码把刚才的线程已经释放掉了 可以用来处理新的请求