tomcat是怎么实现异步servlet的?

问题抛出:

tomcat是怎么实现异步servlet的?
比如,开启异步servlet以后,是不是要向客户端发送ACK保持连接??完成回调complete又做了哪些操作?

 

对于客户端来说,就是一个长连接同步等待服务器输出,你浏览器请求的的时候可以看到标签页一直再刷新,transfer-encoding:chunked一直都没有长度为0的尾块输出

tomcat server.xml配置线程的时候有两个地方,一个是连接器自己的线程配置,另一个就是所有连接器共享的executor


这两个配置决定了tomcat中当前可处理的线程数+socket backlog队列中允许等待的连接数


当客户端发起请求的时候,tomcat异步处理,asynccontext.start(runnable)是把tomcat work线程还回去(所以相当于tomcat又有一个线程可以处理其他客户端的连接),然后启动另一个非tomcat服务器管理的线程来服务与asynccontext保存的request和response


所以此时有两种线程角色,一个是tomcat自己管理的线程,即你在server.xml中配置;另一种是你自己写的线程,即传入asynccontext中的线程逻辑


至于如何把数据返回到客户端,你可以参考socket编程,只要把socket中的流对象保存到request、response中即可,剩下的都tcp/ip传输,客户端监听端口等数据


归根结底,socket编程实际上就是IO流的处理而已


至于最后asynccontext.complete做了什么,其实就是把length=0的最后一个chunked发出去,不显示掉这句代码,你会看到标签页一直在刷新直到超时,显示调用这句代码,会立即出发异步监听器并发送最后一个length=0的chunked

转载于:https://my.oschina.net/yangshj/blog/734457

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值