概述

JBossWeb 是JBoss 中的 Web 容器。他是对 Tomcat 的封装,本文以 Http 连接器为例。简单说明 JBossWeb/Tomcat 初始化连接器和处理 Http 请求过程 。

本文内容提要:

  • Connector 初始化開始过程
  • 怎样理解 max-connections
  • JIoEndpoint 处理 Socket 请求

Connector 初始化開始过程

例如以下图所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva3lsaW5zb29uZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

  1. WebConnectorService 指的是 `org.jboss.as.web.WebConnectorService`
  2. Connector 指的是 `org.apache.catalina.connector.Connector`
  3. Http11Protocol 指的是 `org.apache.coyote.http11.Http11Protocol`
  4. JIoEndpoint 指的是 `org.apache.tomcat.util.net.JIoEndpoint`

Connector init()

Connector 能够是 HTTP Connector,也能够是 AJP Connector,Connector 中有 ProtocolHandler 和 Adapter 属性,Connector 初始化主要包含:初始化 Adapter,且将初始化的 Adapter 的 设定给 ProtocolHandler,然后调运 ProtocolHandler 的初始化方法,如以下代码段所看到的:

        // Initializa adapter
adapter = new CoyoteAdapter(this);
protocolHandler.setAdapter(adapter); IntrospectionUtils.setProperty(protocolHandler, "jkHome", System.getProperty("catalina.base")); try {
protocolHandler.init();
} catch (Exception e) {
throw new LifecycleException(MESSAGES.protocolHandlerInitFailed(e));
}

Http11Protocol init()

Http11Protocol 它有一个 Http11ConnectionHandler Handler。该 Handler 实现 `org.apache.tomcat.util.net.JIoEndpoint.Handler` 接口,Http11Protocol 相同有一个 JIoEndpoint 属性,该属性用来处理 incoming TCP connections,例如以下代码段所看到的:

    protected Http11ConnectionHandler cHandler = new Http11ConnectionHandler(this);
protected JIoEndpoint endpoint = new JIoEndpoint();

Http11Protocol 初始化主要包含:

  • 给 JIoEndpoint 设定名字,默认设定的名字为 http-/127.0.0.1:8080
  • 给 JIoEndpoint 设定 socket handler,设定的 handler 为 Http11ConnectionHandler,该 handler 的作用是 Handling of accepted sockets
  • 调运 JIoEndpoint 的初始化方法

JIoEndpoint init()

JIoEndpoint,关于此类的作用之前我们有说。对该类最直接的总结例如以下:

/**
* Handle incoming TCP connections.
*
* This class implement a simple server model: one listener thread accepts on a socket and
* creates a new worker thread for each incoming connection.
*
* More advanced Endpoints will reuse the threads, use queues, etc.
*
* @author James Duncan Davidson
* @author Jason Hunter
* @author James Todd
* @author Costin Manolache
* @author Gal Shachor
* @author Yoav Shapira
* @author Remy Maucherat
*/
public class JIoEndpoint {

JIoEndpoint 初始化包含:

  • 初始化 Acceptor thread count。默认初始设定的 Acceptor thread count 为 1
  • 初始化 ServerSocketFactory。并通过初始化的 ServerSocketFactory 创建 ServerSocket

Connector start()

Connector 開始方法验证更新当前的状态,并调运 Http11Protocol 的開始方法

Http11Protocol start()

Http11Protocol 的開始方法中直接调运 JIoEndpoint 的開始方法。

JIoEndpoint start()

JIoEndpoint 的開始方法主要包含:

假设外部基于 Executor 的线程池为空。则初始化内部的 workers 栈,该栈保存Worker,初始化的栈大小定义例如以下:

 protected int maxThreads = (org.apache.tomcat.util.Constants.LOW_MEMORY) ?

64 : ((Constants.MAX_THREADS == -1) ? 512 * Runtime.getRuntime().availableProcessors() : Constants.MAX_THREADS);

如上:

  • 假设通过系统參数 -Dorg.apache.tomcat.util.LOW_MEMORY=true,则初始化的栈大小为 64
  • 假设通过系统參数 -Dorg.apache.tomcat.util.net.MAX_THREADS=XXX 指定最大值,则初始化的栈大小为系统參数指定的最大值
  • 假设没有通过系统參数指定 MAX_THREADS,则初始化的栈大小为Runtime.getRuntime().availableProcessors()

启动 Poller 线程,默认线程的名字为 http-/127.0.0.1:8080-Poller。

启动 Acceptor 线程,默认线程的名字为 http-/127.0.0.1:8080-Acceptor-0

例如以下代码段显示如上逻辑

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 event poller thread
eventPoller = new Poller();
eventPoller.init();
Thread pollerThread = new Thread(eventPoller, getName() + "-Poller");
pollerThread.setPriority(threadPriority);
pollerThread.setDaemon(true);
pollerThread.start(); // 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();
}
}
}

怎样理解 max-connections

JBoss Web 中关于max-connections 的定义例如以下

<subsystem xmlns="urn:jboss:domain:web:1.4" default-virtual-server="default-host" native="false">
<connector name="http" protocol="HTTP/1.1" scheme="http" socket-binding="http" max-connections="200" />

如上,假设我们定义了 max-connections,WebConnectorService 開始方法中会有例如以下逻辑:

  • 设定 JIoEndpoint 中 pollerSize,例如以下代码:
    protected int pollerSize = (org.apache.tomcat.util.Constants.LOW_MEMORY) ? 128 : (32 * 1024);
public void setPollerSize(int pollerSize) { this.pollerSize = pollerSize; }
public int getPollerSize() { return pollerSize; }

如上,默认的 pollerSize 假设没有 -Dorg.apache.tomcat.util.LOW_MEMORY=true 设定,它的值为 32 * 1024。

  • 设定 JIoEndpoint 中 maxThreads。例如以下代码段:
    protected int maxThreads = (org.apache.tomcat.util.Constants.LOW_MEMORY) ?

64 : ((Constants.MAX_THREADS == -1) ?

512 * Runtime.getRuntime().availableProcessors() : Constants.MAX_THREADS);
public void setMaxThreads(int maxThreads) { this.maxThreads = maxThreads; }
public int getMaxThreads() { return maxThreads; }

注意,该 maxThreads 用来初始化内部的 workers 栈的大小。

JIoEndpoint 处理 Socket 请求

JIoEndpoint 处理 Socket 请求例如以下图所看到的

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva3lsaW5zb29uZw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

如上,首先 Acceptor 线程(通常名字为 http-/127.0.0.1:8080-Acceptor-0)堵塞等待 Socket 连接,例如以下所看到的:

"http-/127.0.0.1:8080-Acceptor-0" daemon prio=10 tid=0x49ed5800 nid=0xbe9 runnable [0x49789000]
java.lang.Thread.State: RUNNABLE
at java.net.PlainSocketImpl.socketAccept(Native Method)
at java.net.AbstractPlainSocketImpl.accept(AbstractPlainSocketImpl.java:398)
at java.net.ServerSocket.implAccept(ServerSocket.java:522)
at java.net.ServerSocket.accept(ServerSocket.java:490)
at org.apache.tomcat.util.net.DefaultServerSocketFactory.acceptSocket(DefaultServerSocketFactory.java:61)
at org.apache.tomcat.util.net.JIoEndpoint$Acceptor.run(JIoEndpoint.java:309)
at java.lang.Thread.run(Thread.java:722) Locked ownable synchronizers:
- None

//coming soon

JBossWeb/Tomcat 初始化连接器和处理 Http 请求过程的更多相关文章

  1. 关于Tomcat服务器中的协议及请求过程

    关于Tomcat服务器中采用的协议:在Tomcat的server.xml文件中可以找到如下几个Connector <!-- 1. HTTP --> <Connector port=& ...

  2. Tomcat剖析(四):Tomcat默认连接器(2)

    Tomcat剖析(四):Tomcat默认连接器(2) 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三): ...

  3. Tomcat剖析(四):Tomcat默认连接器(1)

    Tomcat剖析(四):Tomcat默认连接器(1) 1. Tomcat剖析(一):一个简单的Web服务器 2. Tomcat剖析(二):一个简单的Servlet服务器 3. Tomcat剖析(三): ...

  4. tomcat 解析(四)-处理http请求过程

    声明:源码版本为Tomcat 6.0.35 前面的文章中介绍了Tomcat初始化的过程,本文将会介绍Tomcat对HTTP请求的处理的整体流程,更细节的. 在上一篇文章中,介绍到JIoEndpoint ...

  5. TOMCAT原理详解及请求过程

    Tomcat: Tomcat是一个JSP/Servlet容器.其作为Servlet容器,有三种工作模式:独立的Servlet容器.进程内的Servlet容器和进程外的Servlet容器. Tomcat ...

  6. TOMCAT原理详解及请求过程(转载)

    转自https://www.cnblogs.com/hggen/p/6264475.html TOMCAT原理详解及请求过程 Tomcat: Tomcat是一个JSP/Servlet容器.其作为Ser ...

  7. Tomcat学习(二)------Tomcat原理详解及请求过程

    Tomcat: Tomcat是一个JSP/Servlet容器.其作为Servlet容器,有三种工作模式:独立的Servlet容器.进程内的Servlet容器和进程外的Servlet容器. Tomcat ...

  8. 走进JavaWeb技术世界5:初探Tomcat的HTTP请求过程

    初探Tomcat的HTTP请求过程 前言:1.作为Java开发人员,大多都对Tomcat不陌生,由Apache基金会提供技术支持与维护,因为其免费开源且易用,作为Web服务器深受市场欢迎,所以有必要对 ...

  9. Spring及tomcat初始化日志

    Tomcat StandardContext初始化过程 //org.apache.catalina.core.StandardContext#startInternal // 子容器启动 for (C ...

随机推荐

  1. JQuery操作基本选择器

    <body> <input type="button" id="btn1" value="选择为one的元素"/> ...

  2. Android 读取手机联系人、拨号、发送短信及长按菜单的操作

    本示例实现了读取手机联系人,拨号.发送短信及长按出现菜单选项的操作↓ 1.Andrid项目结构图↓主要操作图中红色方框内的文件. 2.首先布局代码如下↓ a, main.xml 程序运行的主界面,主要 ...

  3. 003为什么shell的配置文件那么繁琐?

    Bash的设置之所以如此繁琐,是由于历史原因造成的.早期的时候,计算机运行速度很慢,载入配置文件需要很长时间,Bash的作者只好把配置文件分成了几个部分,阶段性载入. 系统的通用设置放在 /etc/p ...

  4. 牛客网 牛客小白月赛1 H.写真がとどいています

    H.写真がとどいています   链接:https://www.nowcoder.com/acm/contest/85/H来源:牛客网     这个题数乱了,导致wa了好几次. 特别弱智,从A开始往上,就 ...

  5. 列表的 sort

    题目:输入三个整数x,y,z,请把这三个数由小到大输出. 实例 #!/usr/bin/python # -*- coding: UTF-8 -*- l = [] for i in range(3): ...

  6. Unique Binary Search Tree - Leetcode

    Given n, how many structurally unique BST's (binary search trees) that store values 1...n? For examp ...

  7. mysql二进制安装,升级,多实例部署

    目标 理解线上部署考虑的因素 学会编译安装以及二进制安装mysql 学会升级mysql 学会多实例部署mysql数据库 学会合理部署mysql线上库   考虑因素: 版本选择,5.1,5.5还是5.6 ...

  8. ASIHTTPRequest 问题总结

    1, ASIHttpRequest与30秒超时 今天在项目中发现一个ASIHttpRequest的Bug.这个Bug可能会导致你Http请求延时至少在timeout设置时间结束之后.更可怕的是,为了找 ...

  9. linux中判断符号[]注意事项

    1.中括号[]内的每个组件都需要有空格键来分割: 2.在中括号内的变量,最好都一双引号括号起来: 3.在中括号内的常量,最好都以单引号或双引号括号起来.

  10. Codeforces Round #277.5 (Div. 2)(C题)

    C. Given Length and Sum of Digits... time limit per test 1 second memory limit per test 256 megabyte ...