Loading [MathJax]/jax/input/TeX/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Jetty启动过程

Jetty启动过程

作者头像
斯武丶风晴
发布于 2019-12-20 03:35:40
发布于 2019-12-20 03:35:40
1.5K00
代码可运行
举报
文章被收录于专栏:龙首琴剑庐龙首琴剑庐
运行总次数:0
代码可运行

启动过程总体流程

Server > ThreadPoolHandler > Connector

Server

启动过程,主要做了以下的事情:

  • 检查,如果 ErrorHandler 没有,则创建一个
  • 注册和启动关闭钩子
  • 启动除了 Connector 的其他所有组件 ThreadPoolHandler
  • 最后启动 Connector
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Server.java
    @Override
    protected void doStart() throws Exception
    {
        // 1.如果 ErrorHandler 没有,则创建一个
        if (_errorHandler == null)
            _errorHandler = getBean(ErrorHandler.class);
        if (_errorHandler == null)
            setErrorHandler(new ErrorHandler());
        if (_errorHandler instanceof ErrorHandler.ErrorPageMapper)
            LOG.warn("ErrorPageMapper not supported for Server level Error Handling");
        _errorHandler.setServer(this);

        //2.If the Server should be stopped when the jvm exits, register
        //with the shutdown handler thread.
        if (getStopAtShutdown())
            ShutdownThread.register(this);

        //3. Register the Server with the handler thread for receiving
        //remote stop commands
        ShutdownMonitor.register(this);
        //Start a thread waiting to receive "stop" commands.
        ShutdownMonitor.getInstance().start(); // initialize

        // 4.启动 Server, 将会启动除了 Connector 的其他所有组件
        MultiException mex = new MultiException();
        try
        {
            super.doStart();
        }
        catch (Throwable e)
        {
            mex.add(e);
        }

        // 5.最后启动 Connector
        if (mex.size() == 0)
        {
            for (Connector connector : _connectors)
            {
                try
                {
                    connector.start();
                }
                catch (Throwable e)
                {
                    mex.add(e);
                }
            }
        }

        if (isDumpAfterStart())
            dumpStdErr();

        mex.ifExceptionThrow();

        LOG.info(String.format("Started @%dms", Uptime.getUptime()));
    }

比如 embedded-jetty-jsp

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
         server = new Server();

        // Define ServerConnector
        ServerConnector connector = new ServerConnector(server);
        connector.setPort(port);
        server.addConnector(connector);

         // Create Servlet context
        ServletContextHandler servletContextHandler = new ServletContextHandler(ServletContextHandler.SESSIONS);
        servletContextHandler.setContextPath("/");
        servletContextHandler.setResourceBase(baseUri.toASCIIString());

        // Since this is a ServletContextHandler we must manually configure JSP support.
        enableEmbeddedJspSupport(servletContextHandler);
    
        // Add Application Servlets
        servletContextHandler.addServlet(DateServlet.class, "/date/");
        // Create Example of mapping jsp to path spec
        ServletHolder holderAltMapping = new ServletHolder();
        holderAltMapping.setName("foo.jsp");
        holderAltMapping.setForcedPath("/test/foo/foo.jsp");
        servletContextHandler.addServlet(holderAltMapping, "/test/foo/");
    
        // Default Servlet (always last, always named "default")
        ServletHolder holderDefault = new ServletHolder("default", DefaultServlet.class);
        holderDefault.setInitParameter("resourceBase", baseUri.toASCIIString());
        holderDefault.setInitParameter("dirAllowed", "true");
        servletContextHandler.addServlet(holderDefault, "/");
        server.setHandler(servletContextHandler);

        // Start Server
        server.start();

Connector

Connector 的实现类 ServerConnector 中,有一个_acceptors的数组,在 Connector 启动的时候, 会根据_acceptors数组的长度创建对应数量的 Acceptor,而 Acceptor 的个数可以配置。

  • 启动 HttpConnectionFactory, SelectorManager
  • 根据_acceptors数组的长度创建对应数量的 Acceptor, 并启动
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// AbstractConnector.java
@Override
    protected void doStart() throws Exception
    {
        ...
        // 启动 HttpConnectionFactory, SelectorManager 等
        super.doStart();
        ...
	
        for (int i = 0; i < _acceptors.length; i++)
        {
            Acceptor a = new Acceptor(i);
            addBean(a);
            getExecutor().execute(a);
        }
    }

Acceptor 本质是一个线程。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ServerConnector.java
    @Override
    public void accept(int acceptorID) throws IOException
    {
        ServerSocketChannel serverChannel = _acceptChannel;
        if (serverChannel != null && serverChannel.isOpen())
        {
            // 阻塞等待客户端的连接
            SocketChannel channel = serverChannel.accept();
            // 连接成功
            accepted(channel);
        }
    }
     
    // 这里已经连接成功
    private void accepted(SocketChannel channel) throws IOException
    {
        channel.configureBlocking(false);
        Socket socket = channel.socket();
        configure(socket);
        // _manager 是 SelectorManager 实例,里面管理了所有的 Selector 实例
        _manager.accept(channel);
    }
SelectorManager

SelectorManager 启动的时候,会把所有的 ManagedSelector 启动了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// SelectorManager.java
    @Override
    protected void doStart() throws Exception
    {
        _lease = ThreadPoolBudget.leaseFrom(getExecutor(), this, _selectors.length);
        for (int i = 0; i < _selectors.length; i++)
        {
            ManagedSelector selector = newSelector(i);
            _selectors[i] = selector;
            addBean(selector);
        }
        super.doStart();
    }

ManagedSelector 启动的时候,会启动 SelectorProducer (使用策略 EatWhatYouKill

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// ManagedSelector.java
    public ManagedSelector(SelectorManager selectorManager, int id)
    {
        _selectorManager = selectorManager;
        _id = id;
        SelectorProducer producer = new SelectorProducer();
        Executor executor = selectorManager.getExecutor();
        _strategy = new EatWhatYouKill(producer, executor);
        addBean(_strategy, true);
        setStopTimeout(5000);
    }
    
    @Override
    protected void doStart() throws Exception
    {
        super.doStart();
        _selector = _selectorManager.newSelector();

        // The producer used by the strategies will never
        // be idle (either produces a task or blocks).

        // The normal strategy obtains the produced task, schedules
        // a new thread to produce more, runs the task and then exits.
        _selectorManager.execute(_strategy::produce);

        // Set started only if we really are started
        Start start = new Start();
        submit(start);
        start._started.await();
    }

by 斯武丶风晴 https://my.oschina.net/langxSpirit

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
jetty启动web项目源码分析
jetty是HTTP服务,HTTP客户端,和javax.servlet的容器。它本身被设计成嵌入式模式,应该将jetty集成到自己的应用,jetty本身可以实例化,能像任何POJO一样使用,用jetty就相当于把Http服务塞进了自己的应用
爬蜥
2024/02/04
3580
jetty启动web项目源码分析
jetty启动web项目源码分析
jetty是HTTP服务,HTTP客户端,和javax.servlet的容器。它本身被设计成嵌入式模式,应该将jetty集成到自己的应用,jetty本身可以实例化,能像任何POJO一样使用,用jetty就相当于把Http服务塞进了自己的应用
爬蜥
2019/07/09
2.9K0
Jetty架构设计之Connector、Handler组件
Jetty是Eclipse基金会的一个开源项目,和Tomcat一样,Jetty也是一个“HTTP服务器 + Servlet容器”,并且Jetty和Tomcat在架构设计上有不少相似的地方。但同时Jetty也有自己的特点,主要是更加小巧,更易于定制化。Jetty作为一名后起之秀,应用范围也越来越广,比如Google App Engine就采用了Jetty来作为Web容器。
JavaEdge
2021/10/18
9810
自家表兄弟Tomcat和Jetty
Jetty是Eclipse基金会的一个开源项目,是“HTTP服务器 + Servlet容器”,并且Jetty和Tomcat在架构设计上有不少相似的地方,实在是像一对表兄弟。
春哥大魔王
2020/03/13
1.5K0
Jetty接受请求过程
ServerConnector.java 的 accepted 方法(ServerSocketChannel#accept 后的处理逻辑)。
斯武丶风晴
2019/12/19
1.8K0
jetty、servlet以及spring的衔接源码分析
对于一个请求来讲,如果只是需要一个静态页面,可以直接在服务器上根据路径访问得到,但是如果请求的数据是一个动态页面,即只有在运行时从后台数据库获取,再拼装东西返回,然后生成一个对应的html文件。在Java中为了实现这个功能,使用的就是Servlet规范。
爬蜥
2019/05/26
7530
Jetty 发布web服务
Jetty provides a Web server and javax.servlet container, plus support for HTTP/2, WebSocket, OSGi, JMX, JNDI, JAAS and many other integrations. These components are open source and available for commercial use and distribution.
WindWant
2020/09/11
4330
聊聊Elasticsearch的RoundRobinSupplier
elasticsearch-7.0.1/libs/nio/src/main/java/org/elasticsearch/nio/RoundRobinSupplier.java
code4it
2019/05/31
3730
聊聊Elasticsearch的RoundRobinSupplier
你没读过的Jetty使用入门
在近几年的开源Java容器市场上,Tomcat依旧保持在龙头老大的位置,其地位丝毫没有被撼动的迹象。与此同时Tomcat也因为架构臃肿结构复杂而饱受批评。作为Tomcat的另一款替代性的Java容器Jetty要比Tomcat简单很多,Jetty作为内嵌容器被开源社区广泛使用。基于Jetty之上有很多轻量级Java Web框架,比如著名的JFinal就是基于Jetty开发出来的。
老钱
2018/08/15
1.2K0
Jetty入门
总述 同tomcat一样,jetty也是一个servlet引擎,jetty的神奇之处在于,jetty不仅可以作为一个web应用的容器,它甚至还可以作为一个程序中的插件来通过main函数加载web应用程序本身。 Jetty 是一个 Web server/servlet container, 支持 SPDY,WebSocket, OSGi, JMX,JNDI, JAAS 。Jetty非常高效而且灵活,Google App Engine 选择了Jetty,而放弃了Tomcat,或是其他的服务器。 Jetty ha
SecondWorld
2018/03/14
1.7K0
Jetty入门
Jetty 与 Tomcat
Tomcat 的关键指标有吞吐量、响应时间、错误数、线程池、CPU 以及 JVM 内存 线程池中的线程数量不足会影响吞吐量和响应时间; 但是线程数太多会耗费大量 CPU; 当内存不足时会触发频繁地 GC,耗费 CPU;
全栈程序员站长
2022/11/17
1.4K0
Jetty 与 Tomcat
Jetty技术深度解析及其在Java中的实战应用
Jetty,作为一款开源的、轻量级、高性能的Java Web服务器和Servlet容器,自1995年问世以来,凭借其卓越的性能、灵活的配置和丰富的扩展功能,在Java Web应用开发中占据了举足轻重的地位。本文将详细介绍Jetty的背景、核心功能点以及在Java中的实战应用,帮助开发者更好地理解和利用Jetty构建高效、可靠的Web服务。
小马哥学JAVA
2024/09/13
1620
Tomcat源码解析(六):Connector、ProtocolHandler、Endpoint
Tomcat源码解析(四):StandardServer和StandardService
冬天vs不冷
2025/01/21
2110
Tomcat源码解析(六):Connector、ProtocolHandler、Endpoint
Tars-Java网络编程源码分析
本文从Java NIO网络编程的基础知识讲到了Tars框架使用NIO进行网络编程的源码分析。
2020labs小助手
2023/03/20
3950
tomcat请求处理分析(四) 监听请求轮询处理
1.1.1.1  startInternal方法 这个方法是核心的启动方法,目前理解主要做了两件事情,第一件是创建轮询线程,即具体的读取线程,它是进行具体的处理,第二个是创建创建监听请求线程,它是等待请求,然后交给轮训进行处理。 public void startInternal() throws Exception { if (!running) { running = true; paused = false; //一种带锁的栈,processorCache processorCache =
cfs
2018/03/08
1.6K0
「高并发通信框架Netty4 源码解读(八)」NIO应用——聊天案例及Reactor线程模式
上面的聊天案例无论是服务端还是客户端,都是单线程的,所有的链接及读写都是在一个main方法所在的主线程内运行。
源码之路
2020/09/04
1.8K0
「高并发通信框架Netty4 源码解读(八)」NIO应用——聊天案例及Reactor线程模式
tomcat-超详细的启动流程(start)
(1)tomcat启动时会先调用脚本,在脚本运行时会启动Bootstrap的main方法,mian方法中会调用load方法进行初始化操作,通过责任链模式将所有结点初始化后,会调用start方法-该方法是tomcat启动的核心方法,即启动tomcat的核心线程。
虞大大
2020/08/26
2.9K0
tomcat-超详细的启动流程(start)
Java编程架构详解——Tomcat 中的 NIO 源码分析
文将介绍 Tomcat 中的 NIO 使用,使大家对 Java NIO 的生产使用有更加直观的认识。
慕容千语
2019/06/11
1.1K0
源码分析 Netty:核心组件及启动过程分析
Channel(通道)是 NIO 基本的结构。JDK的NIO包中,有Channel接口的介绍:
程序员架构进阶
2021/03/22
7080
源码分析 Netty:核心组件及启动过程分析
【Tomcat源码分析】从零开始理解 HTTP 请求处理 (第一篇)
终于步入 Connector 的解析阶段,这无疑是 Tomcat 架构中最为复杂的一环。作为连接器,它的职责显而易见——连接。那么,它连接的究竟是什么呢?
@派大星
2024/09/18
1220
【Tomcat源码分析】从零开始理解 HTTP 请求处理 (第一篇)
相关推荐
jetty启动web项目源码分析
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验