问题抛出:
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