【仿写tomcat】六、解析xml文件配置端口、线程池核心参数

这篇具有很好参考价值的文章主要介绍了【仿写tomcat】六、解析xml文件配置端口、线程池核心参数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

线程池改造

上一篇文章中我们用了Excutors创建了线程,这里我们将它改造成包含所有线程池核心参数的形式。

package com.tomcatServer.http;


import java.util.concurrent.*;

/**
 * 线程池跑龙套
 *
 * @author ez4sterben
 * @date 2023/08/05
 */
public class ThreadPool {
    private int corePoolSize;
    private int maximumPoolSize;
    private long keepAliveTime;

    private static ThreadPoolExecutor threadPoolExecutor;

    public ThreadPool() {

    }

    public synchronized ThreadPoolExecutor getInstance() {
        if (threadPoolExecutor == null) {
            BlockingQueue<Runnable> workQueue = new LinkedBlockingQueue<>();
            ThreadFactory threadFactory = Executors.defaultThreadFactory();
            threadPoolExecutor = new ThreadPoolExecutor(
                    corePoolSize,
                    maximumPoolSize,
                    keepAliveTime,
                    TimeUnit.SECONDS,
                    workQueue,
                    threadFactory
            );
        }
        return threadPoolExecutor;
    }

    public static synchronized void shutdown() {
        if (threadPoolExecutor != null) {
            threadPoolExecutor.shutdown();
            threadPoolExecutor = null;
        }
    }

    public int getCorePoolSize() {
        return corePoolSize;
    }

    public void setCorePoolSize(int corePoolSize) {
        this.corePoolSize = corePoolSize;
    }

    public void setMaximumPoolSize(int maximumPoolSize) {
        this.maximumPoolSize = maximumPoolSize;
    }

    public void setKeepAliveTime(long keepAliveTime) {
        this.keepAliveTime = keepAliveTime;
    }
}

主方法中对多线程操作部分改为使用CompletableFuture执行

 // 5.初始化线程池
        ThreadPoolExecutor executor = XmlParseUtil.initThreadPool(ROOT);
// 6.处理http请求
        try {
            SocketStore.connect(port);
            while (true){
                Socket accept = SocketStore.getSocket().accept();
                if (accept != null){
                    CompletableFuture.runAsync(() -> {
                        try {
                            SocketStore.handleRequest(accept);
                        } catch (IOException e) {
                            throw new RuntimeException(e);
                        }
                    }, executor);
                }
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }finally {
            SocketStore.close();
        }

解析xml文件

现在我们有一个server.xml文件,我想解析其中的端口号以及线程池参数

<tomcat-server>
    <port>80</port>
    <core-pool-size>4</core-pool-size>
    <maximum-pool-size>8</maximum-pool-size>
    <keep-alive-time>60</keep-alive-time>
</tomcat-server>

如果想完成这个功能可以直接使用java本身自带的工具类,下面附上代码

package com.tomcatServer.utils;

import com.tomcatServer.http.ThreadPool;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;
import java.util.concurrent.ThreadPoolExecutor;

public class XmlParseUtil {
    public static Integer parseServerConfig(String root){
        int port = 8080;
        try {
            NodeList nodeList = getServerConfig(root);
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node node = nodeList.item(i);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    Element element = (Element) node;
                    port = Integer.parseInt(element.getElementsByTagName("port").item(0).getTextContent().trim());
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return port;
    }

    public static ThreadPoolExecutor initThreadPool(String root){
        ThreadPool threadPool = new ThreadPool();
        int corePoolSize = 4;
        int maximumPoolSize = 8;
        int keepAliveTime = 60;
        try {
            NodeList nodeList = getServerConfig(root);
            for (int i = 0; i < nodeList.getLength(); i++) {
                Node node = nodeList.item(i);
                if (node.getNodeType() == Node.ELEMENT_NODE) {
                    Element element = (Element) node;
                    corePoolSize = Integer.parseInt(element.getElementsByTagName("core-pool-size").item(0).getTextContent().trim());
                    maximumPoolSize = Integer.parseInt(element.getElementsByTagName("maximum-pool-size").item(0).getTextContent().trim());
                    keepAliveTime = Integer.parseInt(element.getElementsByTagName("keep-alive-time").item(0).getTextContent().trim());

                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        threadPool.setCorePoolSize(corePoolSize);
        threadPool.setMaximumPoolSize(maximumPoolSize);
        threadPool.setKeepAliveTime(keepAliveTime);

        System.out.println(threadPool.getCorePoolSize());
        return threadPool.getInstance();
    }

    private static NodeList getServerConfig(String root) throws ParserConfigurationException, SAXException, IOException {
        File inputFile = new File(root + "\\src\\main\\java\\com\\tomcatServer\\config\\server.xml");

        DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
        DocumentBuilder builder = factory.newDocumentBuilder();
        Document document = builder.parse(inputFile);
        document.getDocumentElement().normalize();
        return document.getElementsByTagName("tomcat-server");
    }
}

启动测试

【仿写tomcat】六、解析xml文件配置端口、线程池核心参数,源码仿写,tomcat,xml,java
现在我的配置文件是这样的,在主方法中打印一下端口号,如果是80说明这个xml扫描成功了,然后我们再去访问80端口的Index页面。
【仿写tomcat】六、解析xml文件配置端口、线程池核心参数,源码仿写,tomcat,xml,java
【仿写tomcat】六、解析xml文件配置端口、线程池核心参数,源码仿写,tomcat,xml,java
http://localhost:8080/index.html
尝试访问8080时,已经无法访问了
【仿写tomcat】六、解析xml文件配置端口、线程池核心参数,源码仿写,tomcat,xml,java
接下来访问80端口
【仿写tomcat】六、解析xml文件配置端口、线程池核心参数,源码仿写,tomcat,xml,java
访问成功

现在我们的tomcat已经有一定的功能了,下一篇作者将对整个tomcat的代码结构做一些优化,并将现阶段的代码分享给读者。

【仿写tomcat】七、项目结构优化以及代码开源文章来源地址https://www.toymoban.com/news/detail-658339.html

到了这里,关于【仿写tomcat】六、解析xml文件配置端口、线程池核心参数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Spring源码(五)— 解析XML配置文件(二) 定制化标签解析流程

    Spring源码(五)— 解析XML配置文件(二) 定制化标签解析流程

    上一篇以bean标签为例,介绍了属于defaultNamesapce标签的解析流程,但是defaultNamespace中默认的标签只有bean、beans、alias、import这四个,而我们平时在xml中配置的标签有很多。那其余的标签是如何解析? 在这篇文章会详细介绍定制化标签的解析流程。 注:除defaultNamesapce所属的4个

    2024年02月15日
    浏览(14)
  • Javaweb之Mybatis的XML配置文件的详细解析

    Javaweb之Mybatis的XML配置文件的详细解析

    Mybatis的开发有两种方式: 注解 XML 使用Mybatis的注解方式,主要是来完成一些简单的增删改查功能。如果需要实现复杂的SQL功能,建议使用XML来配置映射语句,也就是将SQL语句写在XML配置文件中。 在Mybatis中使用XML映射文件方式开发,需要符合一定的规范: XML映射文件的名称

    2024年01月24日
    浏览(5)
  • RocketMQ 单机源码部署 自定义配置文件和端口以及acl权限配置解析

    1、我们首先配置完 namesrv和broker和acl认证的配置文件,然后直接使用-c指定配置文件来启动程序,就会非常明了,用户名密码要大于6,第一个用户我测试着不知道为什么始终有最高权限,大家尽量不要吧第一个用户给别人用。 ​ 1、创建 conf/namesrv.conf 文件 ​ 2、修改 conf/br

    2024年02月13日
    浏览(10)
  • JQuery、JSON、AJAX、XML、IO流、多线程、反射核心知识点详解

    一、什么是JQuery     JQuery是JavaScript的一个框架,对js的封装,使得js简单易学     优点:         1、不用考虑浏览器兼容性问题         2、jquery拥有强大的选择器,简化了js代码         3、jquery提供了很多系统函数,直接调用 二、版本         1.x版本:兼

    2024年02月07日
    浏览(6)
  • 【仿写tomcat】一、tomcat工作流程

    【仿写tomcat】一、tomcat工作流程

    简介 作者前不久刚仿写了一个简易的tomcat,在此分享给各位,此篇为对tomcat的简介和流程分析,具体仿写内容后续会贴在这里 扫描java文件,获取带有@WebServlet注解的类 tomcat简介 Tomcat 服务器是一个免费的开放源代码的Web 应用服务器,属于轻量级应用服务器,在中小型系统和

    2024年02月12日
    浏览(7)
  • 【仿写框架之仿写Tomact】一、Tomcat的工作流程

    【仿写框架之仿写Tomact】一、Tomcat的工作流程

    当涉及到Java Web应用程序的部署和运行,Apache Tomcat无疑是一个备受欢迎的选择。Tomcat作为一个开源的、轻量级的Java Servlet容器和JavaServer Pages (JSP) 容器,扮演着连接用户和应用程序的重要角色。本篇文将向大家阐述Tomcat的执行流程,从启动到请求处理再到关闭,帮助您更好地

    2024年02月12日
    浏览(8)
  • 【仿写框架之仿写Tomact】一、详解Tomcat的工作流程

    【仿写框架之仿写Tomact】一、详解Tomcat的工作流程

    当涉及到Java Web应用程序的部署和运行,Apache Tomcat无疑是一个备受欢迎的选择。Tomcat作为一个开源的、轻量级的Java Servlet容器和JavaServer Pages (JSP) 容器,扮演着连接用户和应用程序的重要角色。本篇文将向大家阐述Tomcat的执行流程,从启动到请求处理再到关闭,帮助您更好地

    2024年02月12日
    浏览(7)
  • Spring核心配置步骤-完全基于XML的配置

    Spring框架的核心配置涉及多个方面,包括依赖注入(DI)、面向切面编程(AOP)等。以下是一般情况下配置Spring应用程序的核心步骤: 1. **引入Spring依赖:** 在项目的构建工具(如Maven、Gradle)配置文件中,添加Spring框架的依赖。 2. **创建Spring配置文件:** 创建一个XML文件(通

    2024年02月11日
    浏览(8)
  • Tomcat的一些配置问题(server.xml/catalina.sh)

    Tomcat的一些配置问题(server.xml/catalina.sh)

            在同一机器中运行多个Tomcat时,如果不修改server.xml的端口参数,会出现端口冲突使得Tomcat异常;Tomcat默认配置中,JAVA_OPTS不会设置太大,一般需要在catalina.sh中增加一行配置来加大该参数值。 目录 1.Server.xml配置 2.Catalina.sh配置 总结         需要改动的端口为

    2024年02月13日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包