tomcat组件-Server

news2024/12/28 19:13:52

目录

概述

tomcat 启动 大致流程

Server

StandardServer

利用8005端口关闭tomcat

总结


概述

了解一个程序,一定要知道他是干什么的,以及内部架构如何支撑这么干的,以及牵扯的到的概念、模式等知识点的解析(这里只介绍组件)。

Tomcat是Apache 开发的Web 应用服务器,支持最新的Servlet 和JSP 规范,servlet jsp是 J2EE里的规范。

学习tomcat组件,有助于指定tomcat启动的流程以及初始化的时候做了哪些工作,为后续请求和响应做准备。

组件从配置的地方来看比较好理解,tomcat核心配置文件是/config/server.xml,如果对配置了解不足,就无法对组件进行探讨。

源码版本:apache-tomcat-8.5.84-src

下载地址:​​​​​​https://dlcdn.apache.org/tomcat/tomcat-8/v8.5.84/src/apache-tomcat-8.5.84-src.zip

tomcat 启动 大致流程

一图胜千言,先不管为啥,先看启动过程

Server

一个Server 就是一个tomcat,一个tomcat实例只能有一个server

其中 8005是tomcat监听关闭的端口号,如果socket监听到接受到了字符串SHUTDOWN,则关闭tomcat具体实现类是StandardServer它内部包含多个Service,代码体现:

private Service services[] = new Service[0];//多个

StandardServer

 分析到这里,可知当前类代表了Server组件,那么tomcat启动的时候做了哪些初始化工作?,先不去分析复杂代码,以及继承类,看主要工作(功能):

启动时调用流程:initInternal()startInternal()

  • addService() 添加子组件,把子组件(web服务)添加到 services 变量中
  • initInternal(),代码如下,忽略其他,可以看到主要是循环调用service的init,这个也可以在上面流程图中有体现
@Override
    protected void initInternal() throws LifecycleException {
        super.initInternal();
//...忽略的代码
// Initialize our defined Services
for (Service service : services) {
    service.init();
}
}
  • startInternal()
protected void startInternal() throws LifecycleException {
    	fireLifecycleEvent(CONFIGURE_START_EVENT, null);
setState(LifecycleState.STARTING);
globalNamingResources.start();
// Start our defined Services
synchronized (servicesLock) {
    for (Service service : services) {
        service.start();
    }
}
}

可以看出主要其调用了 service组件的start()方法

  • destroyInternal() 销毁每个 service
  • await() 这个很重要,主要是监听8005,如果返回,也就是下面代码中接收到 SHOTDOWN后break,tomcat会停止

public void await() {
    ...

    // Set up a server socket to wait on
    try {
    awaitSocket = new ServerSocket(getPortWithOffset(), 1,
                                   InetAddress.getByName(address));//创建 socket 监听:8005 
} catch (IOException e) {
    log.error(sm.getString("standardServer.awaitSocket.fail", address,
                           String.valueOf(getPortWithOffset()), String.valueOf(getPort()),
                           String.valueOf(getPortOffset())), e);
    return;
}

try {
    awaitThread = Thread.currentThread();

    // Loop waiting for a connection and a valid command
    while (!stopAwait) {
        ServerSocket serverSocket = awaitSocket;
        if (serverSocket == null) {
            break;
        }

        // Wait for the next connection
        Socket socket = null;
        StringBuilder command = new StringBuilder();
        try {
            InputStream stream;
            long acceptStartTime = System.currentTimeMillis();
            try {
                socket = serverSocket.accept();//阻塞
                socket.setSoTimeout(10 * 1000);  // Ten seconds
                stream = socket.getInputStream();
            } catch (SocketTimeoutException ste) {
                continue;
            } catch (AccessControlException ace) {
                continue;
            } catch (IOException e) {
                if (stopAwait) {
                    break;
                }
                break;
            }

            // Read a set of characters from the socket
            //这一堆代码就是解析 上边 stream 接受到的内容,放到 变量 command 中

                // Match against our command string
                boolean match = command.toString().equals(shutdown); //就是 SHUTDOWN
            
                if (match) 
                //如果是停止服务命令"" 就退出服务
                log.info(sm.getString("standardServer.shutdownViaPort"));
                break;
            } else {
                log.warn(sm.getString("standardServer.invalidShutdownCommand", command.toString()));
            }
            }
            }

利用8005端口关闭tomcat

使用telnet命令关闭,可百度window如何开启和使用,所以8005是绝不能外网开放的

//cmd 
telnet localhost 8005
此时会链接成功 弹出新窗口,直接输入 SHUTDOWN

如下8005端口接受到SHUTDOWN命令,跳出阻塞,往下执行,后续就是停止tomcat的方法

总结

Server组件是在初始化的时候被Catalina load方法调用,后续开启的组件调用链。当前类主要是socket监听8005端口,一旦接受到SHUTDOWN 就会停止tomcat的运行,所以8005不要对外网开放。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/136045.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

软件测试 | 简历中应该如何描述才能体现出软技能的实力 ?

很多同学写简历的时候,真的是非常纠结的。技术能力怎么写?工作经历怎么写?项目经验怎么写?其中以拥有多个项目经验的同学和没有项目经验的学生最为纠结。前者是项目经验太多了,工作多年,每个项目经验要是都…

2023年全国最新消防设施操作员模拟试题题库及答案

百分百题库提供消防设施操作员考试试题、消防设施操作员考试预测题、消防设施操作员考试真题、消防设施操作员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 15.()是平时不能满足水灭火设施所需的工作压力和流量…

以太网交换基础

以太网协议 以太网是当今现有局域网(Local Area Network,LAN)采用的最通用的通信协议标准。 以太网是建立在CSDA/CD(Carrier Sense Multiple Access/Collision Detection,载波监听多路访问) 冲突域 解决机制&#xff1…

ChatGPT 都在用的身份认证产品,你了解多少?

近期,人工智能研究公司 OpenAI 正式推出 ChatGPT,这是一种基于对话的人工智能聊天机器人模型,它能够理解自然语言并以自然语言的方式做出回应。上线不到一周,用户数已经突破 100 万大关。 上线仅 5 天用户数就突破百万大关&#…

educoder头歌数据结构 查找 第1关:实现折半查找

本文已收录于专栏 🌲《educoder数据结构与算法_大耳朵宋宋的博客-CSDN博客》🌲 任务描述 本关要求通过补全函数BSL_FindKey来实现在已排序的顺序表中查找关键码值为key的结点并返回该结点的编号。 相关知识 折半查找通常是针对顺序存储的线性表&…

SWOT分析

什么是SWOT分析?从做法到具体事例、注意点进行解说 SWOT分析法是将本公司的内部环境和外部环境作为强项(Strength)、弱点(Weakness)、机会(Opportunity)、威胁(Threat)进行梳理和分析的手法。以及把握事业现状的框架。从SWOT分析的方法到具体事例、注意事项,以图解…

砥砺前行,匠心致远|袋鼠云联合创始人、易知微CEO宁海元荣获“数字工匠 ”

近期,在余杭区数管局召开的“学习贯彻二十大,聚力建设新中心”联合主题党日活动暨余杭数改企业联盟党建联建共建机制圆桌恳谈会上,袋鼠云联合创始人、易知微CEO宁海元荣获2022年度“余杭数字工匠”,区数管局党组书记、局长周汝琴为…

【谷粒商城基础篇】商品服务开发:品牌管理

谷粒商城笔记合集 分布式基础篇分布式高级篇高可用集群篇简介&环境搭建项目简介与分布式概念(第一、二章)基础环境搭建(第三章)整合SpringCloud整合SpringCloud、SpringCloud alibaba(第四、五章)前端知…

Linux进程间通信---->共享内存

文章目录什么是共享内存共享内存基本原理和共享内存有关的系统接口ftokshmgetipc相关命令查看相关共享内存信息删除相关共享内存信息shmat/shmdtshmctlipc系列设计思想总结什么是共享内存 前面我们学习了管进程间通信的一种方式—>管道。 而我们今天将要介绍的共享内存也是…

10天,几万字,源码深度解析之 Spring IOC

历时 10 天,终于把 Sping 源码系列写完了,该系列一共 5 篇,后续会整理成 PDF 教程,本文是最后一篇。 这篇文章主要讲解 IOC 容器的创建过程,让你对整体有一个全局的认识,文章没有复杂嵌套的 debug 流程&am…

SA实战 ·《SpringCloud Alibaba实战》第06章-快速搭建三大微服务并完成交互开发与测试

作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 大家好,我是冰河~~ 在《SpringCloud Alibaba实战》专栏中前面的文章,我们为开发用户微服务、商品微服务和订单微服务做了充分的准备。今天…

微服务 SpringBoot 整合 Redis GEO 实现附近商户功能

文章目录⛄引言♨️广播站一、Redis GEO 数据结构用法⛅GEO基本语法、指令⚡使用GEO存储经纬度、查询距离二、SpringBoot 整合Redis 导入 店铺数据 到GEO三、SpringBoot 整合 Redis 实现 附近商户功能☁️需求介绍⚡核心源码✅附近商户效果图⛵小结⛄引言 本文参考黑马 点评项…

Spring之xml方式整合第三方框架

目录 一:概述 二:代码演示 二:Spring整合MyBatis的原理剖析 三:案例演示 一:概述 xml整合第三方框架有两种整合方案: 不需要自定义名空间,不需要使用Spring的配置文件配置第三方框架本身内容,例如&…

VScode连接本地Docker

一、安装VScode和Docker 1、vscode的安装 官网下载到最新的X64安装包,然后使用下述命令进行安装: dpkg -i code_1.73.1-1667967334_amd64.deb 安装成功之后,可以在应用的安装列表中查看到。 2、docker的安装 同上 二、创建docker的用户…

使用nginx临时搭建rtmp服务器

使用nginx临时搭建rtmp服务器 文章目录使用nginx临时搭建rtmp服务器系统环境搭建步骤RTMP服务验证由于需要研究rtmp协议交互方式及报数据格式,使用nginx临时搭建一个rtmp服务器,主要通过nginx的rtmp扩展模块实现接收RTMP推送的音视频流,同时提…

【C++】缺省参数

其实在C基础一文中已经介绍过了缺省参数,但是每次用这玩意都是很迷,今天趁着复习c知识,再来总结一下缺省参数。 🌈1.缺省参数知识图: 看来看去也就这么多的知识点,接下来就一一介绍一下: &…

prometheus监控微服务端口和主机存活

简介: BlackBox Exporter 顾名思义就是在应用程序的外部对其进行探测, 支持 HTTP、HTTPS、DNS、TCP、ICMP等方式对目标进行检测。 官方下载链接 https://github.com/prometheus/blackbox_exporter/releases/download/v0.21.1/blackbox_exporter-0.21.…

CRM管理系统软件哪家好?

规模不大的企业,往往抗风险能力较差、资金不足、员工也相对比较少,此时,客户资源,客户开发往往成为企业生存的基础。 对于企业,一款合适的CRM客户管理系统,绝对是小规模企业的必备工具,可以帮助…

自除数判断,除自身以外数组乘积,[ ]操作符,二维数组内存存储计算,有关进制转换与取数字每一位的问题

tips 1. 表达式求值的时候,首先当然是从左往右看,确定优先级(只针对相邻操作符才有意义),相邻操作符按照优先级高低计算,如果(相邻)操作符的优先级相同(也就是两个操作符…

4G低功耗摄像头模组如何快速唤醒拍照

对于应用在野外恶劣环境,无电无网络的情况下,需要一款能支持太阳能供电或者电池供电,不过前提是,功耗需要足够低,还需要能支持无线网络,能上传图片回到服务器,用于监测一些野外作业的数据&#…