您的位置:首页 > 运维架构 > Tomcat

Tomcat工作原理

2018-02-25 10:59 162 查看


tomcat就是一个tcp服务器socketServer,一直在监听着指定的端口port。

一个tomcat内可以部署多个项目(app),每一个项目都有自身的应用上下文(context)。

一个上下文容器(Context)代表一个web应用,每一个上下文包括多个包装器(Wrapper),每个包装器代表一个Servlet。

tomcat内存在一个process连接池,有请求过来会去连接池内获取process对象对该请求进行处理,连接池有最小连接数和最大连接数,当前请求数超过最大连接数后超出的连接请求将会被丢弃,如果最大连接数设置为负数,则表示无最大连接数限制。

一个process对象接收到请求后不对请求做任何处理,直接创建连接器connector对象。

connector对象才会对该次请求做进一步的处理。

通过连接器connector获取该次请求的socket实例,再通过socket获取输入流inputstream创建HttpServletRequest请求对象,获取socket的输出流outputstream创建HttpServletResponse响应对象。

根据HttpServletRequest对象获取请求的servlet(请求路径),调用tomcat自身实现的类加载器加载该servlet并创建对象实例。

再调用tomcat的包装器Wrapper并将request,response和当前应用上下文context对象传递进去,包装器Wrapper会调用自身的allocate方法获取一个servlet实例。

调用servlet实例的createFilterChain方法获得绑定在该servlet的过滤器链。

调用过滤器链中每一个过滤器的doFilter方法对请求进行过滤处理。

该过滤器处理完成后调用filterChain.release()方法释放自身,处理结果是一个过滤后的servlet对象。

然后调用包装器的wrapper.deallocate(servlet)方法判断该次过滤后的servlet是否可用。

如果过滤后的servlet无法使用,则调用包装器的wrapper.unload()方法。

如果过滤后的servlet可用,在该过滤器的doFilter最后会调用chain.doFilter(request, response);方法,调用下一个过滤器进行处理。如果最后没有调用chain.doFilter,下一个过滤器将不会被调用。如果是最后一个过滤器,则调用该servlet的service方法进入自身业务方法内。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息