【问题标题】:Apache Tomcat component hierarchy processing for each different access requestApache Tomcat 组件层次结构处理每个不同的访问请求
【发布时间】:2021-11-19 20:04:39
【问题描述】:

我正在学习 Apache Tomcat 并阅读有关 Tomcat 6 的书籍。第一章是关于 Tomcat 6 中包含的基本组件。层次结构图描述了相应的基本组件服务器、服务、引擎、主机、上下文和 Apache Web 服务器通过引擎请求连接,通过主机请求 IIS,通过上下文请求 Web 浏览器。我这样解释是因为每个阀门都在这个问题前面提到的每个组件级别的盒子内。

似乎几乎没有关于此图的文档或书籍。 apache web server, IIS, web browser请求连接Tomcat时,是不是和上面不同的组件处理?

【问题讨论】:

    标签: java spring jsp tomcat was


    【解决方案1】:

    绝对不是。

    基本上每个 Tomcat 收到的请求:

    1. 由 Coyote 连接器处理(在多个线程上)。详细信息取决于连接器,
    2. 连接器最终在为请求提供服务的线程上调用 CoyoteAdapter#service
    3. 请求通过EngineHostContextWrapper(代表单个 servlet)组件中的一系列阀门,
    4. FilterChain#doFilter 方法在每个 servlet 容器中被调用。

    您可以通过在 servlet 中引发异常并剖析调用堆栈来进一步了解该过程:

    SEVERE: Servlet.service() for servlet [pl.copernik.servlet.HelloServlet] in context with path [/servlet-test] threw exception [null] with root cause
    jakarta.servlet.ServletException
        at pl.copernik.servlet.HelloServlet.doGet(HelloServlet.java:25)
        *** Servlet API: ***
        at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:665)
        at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:774)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:223)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
        at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:185)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:158)
        *** Catalina Valves: ***
        at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
        at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
        at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:543)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:119)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:353)
        *** Coyote connector details: ***
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:870)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1699)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        *** Thread pool details: ***
        at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
        at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.base/java.lang.Thread.run(Thread.java:829)
    

    【讨论】:

    • 感谢您的热情回复!如果我理解正确,所有请求都通过引擎、主机、上下文?我认为这张图很有意义,你的建议帮助我找到了学习的起点。
    • 是的,Engine 是每个请求的入口点,如果请求有效(不是 404 错误),它将遍历 HostContextWrapper 组件。
    • 对我帮助很大。第一个按钮非常适合开始学习。感谢您的关心,伙计!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-15
    • 2018-11-12
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多