(五)Tomcat源码阅读:Engine组件分析

news/2024/2/27 11:34:30

一、概述

在阅读源码之前我们需要对各个类的关系有一个清晰的了解,下面就是Engine各个类之间的关系,我们将会按照从上到下的顺序阅读源码。

二、阅读源码

1、Container

(1)注释

Container可以处理请求并给予相应,并且它还支持由流水线组成的阀门。

/*** A <b>Container</b> is an object that can execute requests received from* a client, and return responses based on those requests.  A Container may* optionally support a pipeline of Valves that process the request in an* order configured at runtime, by implementing the <b>Pipeline</b> interface* as well.
*/

(2)方法

这里引出了流水线比较重要。

/*** Return the Pipeline object that manages the Valves associated with* this Container.** @return The Pipeline*/Pipeline getPipeline();

该方法常用于执行一些周期性的任务例如重载等,使用这个方法可能会重新加载上下文。

    /*** Execute a periodic task, such as reloading, etc. This method will be* invoked inside the classloading context of this container. Unexpected* throwables will be caught and logged.*/void backgroundProcess();

BackgroundProcessorDelay这个值设置为负时将不会和父类共享线程,而设置为正时将会共享线程并执行周期方法。

    /*** Get the delay between the invocation of the backgroundProcess method on* this container and its children. Child containers will not be invoked if* their delay value is positive (which would mean they are using their own* thread). Setting this to a positive value will cause a thread to be* spawned. After waiting the specified amount of time, the thread will* invoke the {@link #backgroundProcess()} method on this container and all* children with non-positive delay values.** @return The delay between the invocation of the backgroundProcess method*         on this container and its children. A non-positive value*         indicates that background processing will be managed by the*         parent.*/int getBackgroundProcessorDelay();/*** Set the delay between the invocation of the execute method on this* container and its children.** @param delay The delay in seconds between the invocation of*              backgroundProcess methods*/void setBackgroundProcessorDelay(int delay);

 添加子容器和监听器。

void addChild(Container child);void addContainerListener(ContainerListener listener);void addPropertyChangeListener(PropertyChangeListener listener);

 (2)容器事件

/*** The ContainerEvent event type sent when a child container is added* by <code>addChild()</code>.*/String ADD_CHILD_EVENT = "addChild";/*** The ContainerEvent event type sent when a valve is added* by <code>addValve()</code>, if this Container supports pipelines.*/String ADD_VALVE_EVENT = "addValve";/*** The ContainerEvent event type sent when a child container is removed* by <code>removeChild()</code>.*/String REMOVE_CHILD_EVENT = "removeChild";/*** The ContainerEvent event type sent when a valve is removed* by <code>removeValve()</code>, if this Container supports pipelines.*/String REMOVE_VALVE_EVENT = "removeValve";

2、Engine

(1)注释

Engine是处理servlet的引擎。

/*** An <b>Engine</b> is a Container that represents the entire Catalina servlet* engine. 
*/

3、ContainerBase

(1)内部类

这个内部类利用了递归的方法执行了周期性事件。

protected class ContainerBackgroundProcessor implements Runnable {@Overridepublic void run() {Throwable t = null;String unexpectedDeathMessage = sm.getString("containerBase.backgroundProcess.unexpectedThreadDeath",Thread.currentThread().getName());try {while (!threadDone) {try {Thread.sleep(backgroundProcessorDelay * 1000L);} catch (InterruptedException e) {// Ignore}if (!threadDone) {processChildren(ContainerBase.this);}}} catch (RuntimeException | Error e) {t = e;throw e;} finally {if (!threadDone) {log.error(unexpectedDeathMessage, t);}}}protected void processChildren(Container container) {ClassLoader originalClassLoader = null;try {if (container instanceof Context) {Loader loader = ((Context) container).getLoader();// Loader will be null for FailedContext instancesif (loader == null) {return;}// Ensure background processing for Contexts and Wrappers// is performed under the web app's class loaderoriginalClassLoader = ((Context) container).bind(false, null);}container.backgroundProcess();Container[] children = container.findChildren();for (Container child : children) {if (child.getBackgroundProcessorDelay() <= 0) {processChildren(child);}}} catch (Throwable t) {ExceptionUtils.handleThrowable(t);log.error(sm.getString("containerBase.backgroundProcess.error"), t);} finally {if (container instanceof Context) {((Context) container).unbind(false, originalClassLoader);}}}}

4、StandardEngine

(1)方法

构造方法要求需要设置对应的阀门。

public StandardEngine() {super();pipeline.setBasic(new StandardEngineValve());/* Set the jvmRoute using the system property jvmRoute */try {setJvmRoute(System.getProperty("jvmRoute"));} catch (Exception ex) {log.warn(sm.getString("standardEngine.jvmRouteFail"));}// By default, the engine will hold the reloading threadbackgroundProcessorDelay = 10;}

StandardEngine的开始和结束方法调用了父类的初始化和开始方法,而父类的这些方法使用了线程池。

    @Overrideprotected void initInternal() throws LifecycleException {// Ensure that a Realm is present before any attempt is made to start// one. This will create the default NullRealm if necessary.getRealm();super.initInternal();}@Overrideprotected synchronized void startInternal() throws LifecycleException {// Log our server identification informationif (log.isInfoEnabled()) {log.info(sm.getString("standardEngine.start", ServerInfo.getServerInfo()));}// Standard container startupsuper.startInternal();}


http://www.ppmy.cn/news/35343.html

相关文章

https是如何保证安全的

在学习http与https的区别的时候&#xff0c;我们通常从以下几点出发&#xff1a;http是超文本传输协议&#xff0c;是明文传输&#xff0c;有安全风险&#xff0c;https在TCP和http网络层之间加入了SSL/TLS安全协议&#xff0c;使得报文能够加密传输http连接简单&#xff0c;三…

python实战应用讲解-【numpy专题篇】numpy常见函数使用示例(七)(附python示例代码)

目录 NumPy矢量乘法 Python numpy.who函数 Numpy向量操作的并行化 NumExpr 对比性能 使用Logistic回归进行安置预测 以下是分步实现: 从NumPy数组中绘制直线图 NumPy矢量乘法 矢量乘法有三种类型。 Scalar ProductDot ProductCross

realloc的补充 柔性数组

&#x1f436;博主主页&#xff1a;ᰔᩚ. 一怀明月ꦿ ❤️‍&#x1f525;专栏系列&#xff1a;线性代数&#xff0c;C初学者入门训练&#xff0c;题解C&#xff0c;C的使用文章&#xff0c;「初学」C &#x1f525;座右铭&#xff1a;“不要等到什么都没有了&#xff0c;才下…

大数据的常用算法(分类、回归分析、聚类、关联规则、神经网络方法、web数据挖掘)

在大数据时代&#xff0c;数据挖掘是最关键的工作。大数据的挖掘是从海量、不完全的、有噪声的、模糊的、随机的大型数据库中发现隐含在其中有价值的、潜在有用的信息和知识的过程&#xff0c;也是一种决策支持过程。其主要基于人工智能&#xff0c;机器学习&#xff0c;模式学…

图像处理:双边滤波算法

今天主要是回顾一下双边滤波&#xff0c;我曾经在这篇——图像处理&#xff1a;推导五种滤波算法中推导过它&#xff0c;其中包含了我自己写的草稿图。 目录 双边滤波算法原理 &#xff08;1&#xff09;空间域核 &#xff08;2&#xff09;值域核 理解双边滤波 空域权重​…

Thingsboard开源物联网平台智慧农业实例快速部署教程(二)【手把手部署UI与动态数据】

Thingsboard开源物联网平台智慧农业实例快速部署教程&#xff08;二&#xff09;【部署UI与动态数据】 文章目录Thingsboard开源物联网平台智慧农业实例快速部署教程&#xff08;二&#xff09;【部署UI与动态数据】1. 页面总览2. 设备2.1 数据字段定义2.2 设备映射关系2.3 添加…

【数据结构与算法】 - (不带头结点)单链表详细实现思路及代码(C/C++语言)

目录 一、概述 二、头结点的介绍及作用 三、不带头结点单链表实现  &#x1f4cc;3.1 C语言定义链表结点  &#x1f4cc;3.2 无头结点单链表初始化  &#x1f4cc;3.3 无头结点单链表插入数据  &#x1f4cc;3.4 无头结点单链表删除数据  &#x1f4cc;3.5 无头结点单链表…

UE4/5 C++网络服务器编程纪录【零】--准备篇

前言之前利用业余时间重新复习UE4/5的C开发&#xff0c;闲来无事做了个基于独立服务器的多人在线&#xff08;目前限定客户数量是20人以内&#xff09;DEMO&#xff0c;核心功能在我之前发的B站视频里面有&#xff0c;战斗、动作、交互以及场景演示都有了&#xff0c;有朋友看了…

WebSocket 测试工具

一、WebSocket 简介 WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和服务器只需要完成一次握手&#xff0c;两者之间就直…

Python接口自动化 ❀ 详解 Cookie-Session登录验证 的工作原理

Python接口自动化 ❀ 详解 Cookie-Session登录验证 的工作原理前言1、Cookie&Session❀ 为什么不能单独使用Cookie&#xff1f;❀ Session是如何与Cookie结合的&#xff1f;2、Cookie&Session的缺陷❀ 存储问题❀CSRF问题3、session和cookie的区别与联系前言 目前绝大…

安全防御第四天:防病毒网关

一、恶意软件1.按照传播方式分类&#xff08;1&#xff09;病毒病毒是一种基于硬件和操作系统的程序&#xff0c;具有感染和破坏能力&#xff0c;这与病毒程序的结构有关。病毒攻击的宿主程序是病毒的栖身地&#xff0c;它是病毒传播的目的地&#xff0c;又是下一次感染的出发点…

【软件测试】基础知识第一篇

文章目录一. 什么是软件测试二. 测试和调试的区别三. 什么是测试用例四. 软件的生命周期五. 软件测试的生命周期一. 什么是软件测试 软件测试就是验证软件产品特性是否满足用户的需求。 那需求又是什么呢&#xff1f;在多数软件公司&#xff0c;会有两种需求&#xff0c;一种…

C++ 直接初始化和拷贝初始化

首先我们介绍直接初始化&#xff1a;编译器使用普通的函数匹配来选择与我们提供的参数最匹配的构造函数。文字描述可能会让你们云里雾里&#xff0c;那我们直接看代码&#xff1a; //先设计这样的一个类 class A{ public:A(){ cout << "A()" << endl; }A…

Java Web 实战 16 - 计算机网络之传输层协议(1)

文章目录传输层协议1. UDP 协议2. TCP 协议2.1 TCP 协议报头 确认应答2.2 超时重传2.3 连接管理 (三次握手 , 四次挥手)三次握手三次握手的原理为什么要三次握手 ?三次握手的意义三次握手另外的作用四次挥手连接管理机制大家好 , 这篇文章 , 给大家分享的是 传输层协议中的 U…

网络编程2(套接字编程)

套接字编程UDP协议通信&#xff1a;TCP通信&#xff1a;套接字编程&#xff1a;如何编写一个网络通信程序 1.网络通信的数据中都会包含一个完整的五元组&#xff1a; sip&#xff0c;sport&#xff0c;dip&#xff0c;dport&#xff0c;protocol&#xff08;源IP&#xff0c;源…

Linux基础知识点总结

♥️作者&#xff1a;小刘在C站 ♥️个人主页&#xff1a;小刘主页 ♥️每天分享云计算网络运维课堂笔记&#xff0c;努力不一定有收获&#xff0c;但一定会有收获加油&#xff01;一起努力&#xff0c;共赴美好人生&#xff01; ♥️夕阳下&#xff0c;是最美的绽放&#xff0…

1.4、第三阶段 MySQL数据库

root数据库技术 一、数据库理论 1 什么是数据库技术 数据库技术主要研究如何组织、存储数据&#xff0c;并如何高效地提取和处理数据。 2 什么是SQL SQL&#xff08;Structured Query Language&#xff09;结构化查询语言 SQL是操作数据库的命令集&#xff0c;也是功能齐全的…

【Spring Cloud Alibaba】7.Sentinel熔断器仪表盘监控

文章目录简介什么是 Sentinel控制台获取源码方式下载jar包方式启动访问服务配置项目&#xff0c;启用Sentinel完整配置测试简介 接下来我们通过Sentinel控制台来实现对服务消费者提供的熔断机制进行监控和控制&#xff0c;本操作先要完成之前的步骤&#xff0c;详情请参照【Sp…

Typora文件别人打开不显示图片-图像处理

原因 我们将Typora文件发给别人&#xff0c;别人打开文件时&#xff0c;图像不显示。这个因为Typora的图片是引用电脑的绝对路径&#xff0c;文件里的图片路径别人电脑上不存在&#xff0c;所以别人就看不到图片。 解决办法 这里的解决办法是使用图片文件夹&#xff0c;将文件的…

STM32数据搬运工DMA

DMA的概念DMA&#xff0c;全称为&#xff1a;Direct Memory Access&#xff0c;即直接存储器访问。DMA 传输方式无需 CPU 直接控制传输&#xff0c;也没有中断处理方式那样保留现场和恢复现场的过程&#xff0c;通过硬件为 RAM 与 I/O 设备开辟一条直接传送数据的通路&#xff…
最新文章