当前位置: 首页 > 知识库问答 >
问题:

Apache Tomcat组件层次结构处理每个不同的访问请求

冉昊
2023-03-14

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

似乎几乎没有关于这个图表的文件或书籍。当apache web服务器、IIS和web浏览器请求连接到Tomcat时,是否由上述不同的组件处理?

共有1个答案

郑正阳
2023-03-14

绝对不是。

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

  1. 由Coyote连接器(多线程)处理。细节取决于连接器
  2. 连接器最终在选择为请求提供服务的线程上调用CoyoteAdapter service
  3. 请求通过引擎、主机、上下文和包装器(代表单个servlet)组件中的一系列阀门
  4. 在每个servlet容器中都会调用FilterChain#doFilter方法

您可以通过在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)
 类似资料:
  • 我正在处理一个需求。当前有一个搜索页面,其中包含值(示例数据)1)Employee和2)Sport Person的列表框。 对象层次结构(Hibernate Bean)Person是实际对象,它具有两个不同的类1)Employee和2)基于Sports Person的鉴别器列 Person_Type(鉴别器列)。 在搜索页面上,如果用户选择任何一个列表框,将从该子类中得到数据。 现在的要求是同时显

  • 因此,这里的问题是,我不明白为什么python3版本的openCV的findOnTours()函数返回空层次结构,因此没有找到轮廓。 一点上下文:我从图像中提取形状,如果形状太大(例如,根据区域等特征),那么我提取这个形状并单独分析。这意味着我寻找可以在“大”形状中出现的进一步轮廓。 我需要确定这个事实:如果层次是空的,我可以在我正在处理的“大”图像中没有轮廓吗? 一段代码可以进一步澄清: 运行代

  • 问题内容: 每个HTTP请求是否在不同的线程中访问相同的servlet对象?还是创建一个新的线程和新的Servlet实例? 问题答案: 如果您的servlet未实现,则容器将使用相同的servlet实例。否则,不能保证击中相同的物体。如果认为必要,容器可以自由创建更多的servlet实例。但是请求来自不同的线程,不一定是新创建的(如Sanjay所述)。 根据Servlet 3.0规范: 对于未在分

  • 在Tableau中,可以构建层次结构以可视化数据。可以通过以下步骤在Tableau中创建它: 例如,考虑数据源,例如Sample-Superstore,以及它的维度和度量。 第1步: 首先转到工作表。然后, 选择一个维度,然后右键单击该维度以创建层次结构。 转到“层次结构(Hierarchy)”选项。 并且,单击下面屏幕截图中显示的“创建层次结构(Create Hierarchy)”选项。 第2步

  • 通过学习《 Linux一切皆文件》一节我们知道,平时打交道的都是文件,那么,应该如何找到它们呢?很简单,在 Linux 操作系统中,所有的文件和目录都被组织成以一个根节点“/”开始的倒置的树状结构,如图 1 所示。 图 1 Linux 系统文件和目录组织示意图 其中,目录就相当于 Windows 中的文件夹,目录中存放的既可以是文件,也可以是其他的子目录,而文件中存储的是真正的信息。 文件系统的最

  • 如果我有这样一门课: 获取节点的所有父层次结构的最简单/最优雅的方法是什么? 类似于: