这次主要解析采用IO方式处理请求.在Server.xml的配置如下:
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" />
在tomcat启动的时候,会调用Connector类的Start()方法,根据以上配置,Connector的start()方法里会调用Http11Protocol类的start()方法,如下:
try {
protocolHandler.start();
} catch (Exception e) {
String errPrefix = "";
if(this.service != null) {
errPrefix += "service.getName(): \"" + this.service.getName() + "\"; ";
}
throw new LifecycleException
(errPrefix + " " + sm.getString
("coyoteConnector.protocolHandlerStartFailed", e));
}
Http11Protocol类的start()方法又会调用类的start()方法,如下:
try {
endpoint.start();
} catch (Exception ex) {
log.error(sm.getString("http11protocol.endpoint.starterror"), ex);
throw ex;
}
类的start()方法如下:
public void start()
throws Exception {
// Initialize socket if not done before
if (!initialized) {
init();
}
if (!running) {
running = true;
paused = false;
// Create worker collection
if (executor == null) {
workers = new WorkerStack(maxThreads);
}
// Start acceptor threads
for (int i = 0; i < acceptorThreadCount; i++) {
Thread acceptorThread = new Thread(new Acceptor(), getName() + "-Acceptor-" + i);
acceptorThread.setPriority(threadPriority);
acceptorThread.setDaemon(daemon);
acceptorThread.start();
}
}
}
该方法主要初始化了接受Socket的线程Acceptor类,处理Socket的线程池WorkerStack.Acceptor类的run()方法如下:
public void run() {
// Loop until we receive a shutdown command
while (running) {
// Loop if endpoint is paused
while (paused) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// Ignore
}
}
// Accept the next incoming connection from the server socket
try {
Socket socket = serverSocketFactory.acceptSocket(serverSocket);
serverSocketFactory.initSocket(socket);
// Hand this socket off to an appropriate processor
if (!processSocket(socket)) {//将socket交给线程池WorkerStack处理
// Close socket right away
try {
socket.close();
} catch (IOException e) {
// Ignore
}
}
}catch ( IOException x ) {
if ( running ) log.error(sm.getString("endpoint.accept.fail"), x);
} catch (Throwable t) {
log.error(sm.getString("endpoint.accept.fail"), t);
}
// The processor will recycle itself when it finishes
}
}
}
processSocket(socket)方法如下:
protected boolean processSocket(Socket socket) {
try {
if (executor == null) {
getWorkerThread().assign(socket);//将socket分给独立的线程worker处理
} else {
executor.execute(new SocketProcessor(socket));
}
} catch (Throwable t) {
// This means we got an OOM or similar creating a thread, or that
// the pool and its queue are full
log.error(sm.getString("endpoint.process.fail"), t);
return false;
}
return true;
}
worker的run()方法如下:
public void run() {
// Process requests until we receive a shutdown signal
while (running) {
// Wait for the next socket to be assigned
Socket socket = await();
if (socket == null)
continue;
// 将socket交给Http11ConnectionHandler处理
if (!setSocketOptions(socket) || !handler.process(socket)) {
// Close socket
try {
socket.close();
} catch (IOException e) {
}
}
// Finish up this request
socket = null;
recycleWorkerThread(this);
}
}
handler.process(socket)方法如下:
if (processor == null) {
processor = createProcessor();
}
if (processor instanceof ActionHook) {
((ActionHook) processor).action(ActionCode.ACTION_START, null);
}
if (proto.isSSLEnabled() && (proto.sslImplementation != null)) {
processor.setSSLSupport
(proto.sslImplementation.getSSLSupport(socket));
} else {
processor.setSSLSupport(null);
}
//socket交由Http11Processor的process()方法处理
processor.process(socket);
return false;
processor.process(socket)负责解析http协议并返回结果内容
分享到:
相关推荐
【标题】:“解析Tomcat处理请求的类Connector<三>” 在Java的Web服务器领域,Tomcat无疑是最为广泛使用的轻量级应用服务器之一。它以其开源、免费、高效的特点深受开发者喜爱。在这个系列的第三部分,我们将深入...
本文将详细解析Tomcat的核心配置元素,包括`<Server>`、`<Service>`、`<Engine>`、`<Host>`和`<Context>`,帮助读者更好地理解和优化Tomcat的运行环境。 首先,`<Server>`元素是Tomcat实例的顶级容器,由`org....
在结构上,Tomcat的顶层类元素包括`<Server>`和`<Service>`,连接器类元素负责通信接口,而容器类元素则分为`Engine`、`Host`和`Context`,它们分别负责处理请求、特定虚拟主机请求和特定Web应用请求。所有的Tomcat...
<artifactId>mysql-connector-java</artifactId> </dependency> <!-- 日志 --> <dependency> <groupId>org.slf4j</groupId> <artifactId>slf4j-log4j12</artifactId> </dependency> <!-- 连接池 --> ...
4. `<Engine>`元素:`<Engine>`代表一个Servlet引擎,处理来自`<Connector>`的所有请求。`name`属性是引擎的名称,通常默认为`Catalina`。它还可以包含一个或多个`<Host>`元素,每个`<Host>`代表虚拟主机。 5. `...
3. **WEB SERVICE部分**:这部分由`<Service>`标签表示,定义了Tomcat的服务实例,每个服务可以包含多个`<Connector>`(监听端口)和`<Engine>`(处理HTTP请求)。`<Connector>`配置了Tomcat监听的IP地址和端口,...
- `<Service>` 元素:每个 `<Service>` 元素只能有一个 `<Engine>` 元素,处理所有 `<Connector>` 元素接收到的客户请求。 - `<Engine>` 元素:处理在同一 `<Service>` 中所有 `<Connector>` 元素接收到的客户请求...
`<Service>`通常用于处理来自Web客户端的请求,而`<Connector>`元素则负责连接器的配置,用于定义如何与客户端进行通信。 接着,`<Engine>`元素是`<Service>`的子元素,由`org.apache.catalina.Engine`接口定义,它...
`<Engine>`是Service的服务引擎,它负责接收和处理来自Connector的所有请求。`defaultHost`属性定义了默认处理请求的主机名。 5. `<Host>`元素 `<Host>`元素代表一个虚拟主机,它有自己的名称(`name`属性)和...
`<Service>`元素不直接处理请求,它是一个或多个`<Connector>`和一个`<Engine>`的集合。每个`<Service>`都关联一个特定的`<Engine>`,用于处理所有传入的请求。 3. **Connector 组件** `<Connector>`组件是Tomcat...
`<Engine>`元素是处理来自`<Connector>`请求的容器。它拥有`defaultHost`属性,指定默认处理请求的虚拟主机名称。 ### 5. <Host> 元素:虚拟主机 `<Host>`元素用于配置虚拟主机,每个`<Host>`元素代表一个虚拟主机...
每个 `<Service>` 只能包含一个 `<Engine>`,用于处理在同一 `<Service>` 中的所有 `<Connector>` 接收到的客户端请求,并将处理结果返回给 `<Connector>`。 - **支持的属性**:`<Engine>` 元素通常不会直接配置...
- `<Engine>` 元素是 `<Service>` 的子元素,它代表了 Tomcat 的“引擎”,负责处理 `<Connector>` 接收到的请求。 - `<Engine>` 组件可以包含一个或多个 `<Host>` 元素,每个 `<Host>` 对应一个虚拟主机。 5. **...
- `<Engine>`:容器类元素,处理特定Service的所有请求,可以包含多个`<Host>`。 - `<Host>`:处理特定虚拟主机的请求,可以包含多个`<Context>`。 - `<Context>`:处理特定Web应用的请求,是最底层的容器。 5. ...
<artifactId>mysql-connector-java</artifactId> <version>5.1.37</version> </dependency> <!-- 日志相关 --> <dependency> <groupId>log4j</groupId> <artifactId>log4j</artifactId> <version>${log4j....
`<Engine>`元素表示一个请求处理机,负责接收和处理来自`<Connector>`的请求。关键配置包括: - **defaultHost**:指定默认处理请求的主机名,需与某`<Host>`元素的`name`属性匹配。 ### 5. <Host> 元素:虚拟主机...
每个<Service>元素包含一个<Connector>,用于监听和处理网络连接,一个<Engine>用于处理特定Service的所有客户请求,以及多个<Host>,每个<Host>代表一个虚拟主机,可以包含多个<Context>,每个<Context>对应一个Web...
`<Engine>`元素是请求处理引擎,负责接收来自`Connector`的请求并分发给相应的`Host`。`defaultHost`属性指定了未明确指定主机名时的默认处理主机。`<Host>`元素代表虚拟主机,`name`属性定义了主机名,`appBase`...
<artifactId>mysql-connector-java</artifactId> <version>8.x.x</version> </dependency> <!-- Servlet & JSTL for view rendering --> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax....
<artifactId>mysql-connector-java</artifactId> <version>8.x.y.RELEASE</version> </dependency> </dependencies> ``` 接下来,配置Spring的核心文件ApplicationContext.xml,包括Bean的定义和AOP、DI的配置。...