`
yjhexy
  • 浏览: 332262 次
  • 性别: Icon_minigender_1
  • 来自: 火星
社区版块
存档分类
最新评论

tomcat 分配请求之——socket获取请求

阅读更多

首先,安装,调试tomcat的源码:

http://smiky.iteye.com/blog/613151

写得很全。

=========================================================
     主要描述下 tomcat如何接收请求,并分发处理的,里面有一些线程处理的细节。挺值得品味的

 

tomcat 等待用户请求的类:

 protected class Acceptor implements Runnable {

        /**
         * The background thread that listens for incoming TCP/IP connections and hands them off to an appropriate
         * processor.
         */
        public void run() {

            // Loop until we receive a shutdown command
            while (running) {

                // Loop if endpoint is paused
                while (paused) {
                    try {
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        // Ignore
                    }
                }

                // Accept the next incoming connection from the server socket
                try {
                    // 这里等待用户的请求进入,线程会阻塞,直到等到用户的请求为止
                    Socket socket = serverSocketFactory.acceptSocket(serverSocket);
                    serverSocketFactory.initSocket(socket);
                    // Hand this socket off to an appropriate processor
                    if (!processSocket(socket)) {
                        // Close socket right away
                        try {
                            socket.close();
                        } catch (IOException e) {
                            // Ignore
                        }
                    }
                } catch (IOException x) {
                    if (running) log.error(sm.getString("endpoint.accept.fail"), x);
                } catch (Throwable t) {
                    log.error(sm.getString("endpoint.accept.fail"), t);
                }

                // The processor will recycle itself when it finishes

            }

        }

    }

 

processSocket方法:

    /**
     * Process given socket.
     */
    protected boolean processSocket(Socket socket) {
        try {
            if (executor == null) {
                // 没有线程池队列,从WorkStack中获取一个,并分配给他做操作(WorkStack相当于线程池的作用)
                getWorkerThread().assign(socket);
            } else {
                // 有线程池队列,直接new 一个SocketProcessor对这个socket连接做处理
                executor.execute(new SocketProcessor(socket));
            }
        } catch (Throwable t) {
            // This means we got an OOM or similar creating a thread, or that
            // the pool and its queue are full
            log.error(sm.getString("endpoint.process.fail"), t);
            return false;
        }
        return true;
    }

 

工人类:

 protected class Worker implements Runnable {

        protected Thread  thread    = null;
        protected boolean available = false;
        protected Socket  socket    = null;

        /**
         * Process an incoming TCP/IP connection on the specified socket. Any exception that occurs during processing
         * must be logged and swallowed. <b>NOTE</b>: This method is called from our Connector's thread. We must assign
         * it to our own thread so that multiple simultaneous requests can be handled.
         * 
         * @param socket TCP socket to process
         */
        synchronized void assign(Socket socket) {

            // Wait for the Processor to get the previous Socket
            while (available) {
                // 当前Worker是否处于可用状态
                try {
                    wait();
                } catch (InterruptedException e) {
                }
            }

            // Store the newly available Socket and notify our thread
            this.socket = socket;
            available = true;
            notifyAll();

        }

        /**
         * Await a newly assigned Socket from our Connector, or <code>null</code> if we are supposed to shut down.
         */
        private synchronized Socket await() {

            // 如果处于闲置状态,就等待新的任务分配
            while (!available) {
                try {
                    wait();
                } catch (InterruptedException e) {
                }
            }

            // Notify the Connector that we have received this Socket
            Socket socket = this.socket;
            available = false;
            notifyAll();

            return (socket);

        }

        /**
         * The background thread that listens for incoming TCP/IP connections and hands them off to an appropriate
         * processor.
         */
        public void run() {

            // Process requests until we receive a shutdown signal
            while (running) {

                // Wait for the next socket to be assigned
                Socket socket = await();
                if (socket == null) continue;

                // 处理该次请求
                if (!setSocketOptions(socket) || !handler.process(socket)) {
                    // Close socket
                    try {
                        socket.close();
                    } catch (IOException e) {
                    }
                }

                // Finish up this request
                socket = null;
                // 回收该线程池的使用
                recycleWorkerThread(this);

            }

        }

 

 以上代码的大致示意图:

 

  • 大小: 37.5 KB
分享到:
评论

相关推荐

    解析Tomcat处理请求的类Connector<三>

    在这个系列的第三部分,我们将深入探讨Tomcat处理HTTP请求的核心组件——`Connector`类。`Connector`是Tomcat与外部世界交互的关键桥梁,负责接收并转发HTTP请求到内部的Servlet容器进行处理。 首先,我们来理解`...

    tomcat的工作原理

    然而,无论版本如何变化,Tomcat的核心理念——高效、可靠地处理Web请求——始终未变。 四、示例与实践 为了更好地理解Tomcat的工作原理,我们可以通过一个简单的Web服务器和servlet容器的实现来深入探讨。例如,...

    tomcat源码解析

    在深入探讨Tomcat的具体实现前,我们需要了解其核心组件——Catalina模块的基本结构。Catalina是Tomcat的核心组件之一,负责处理HTTP请求。它通过一系列的层次结构来组织和管理Web应用,这些结构包括Server、Service...

    how-tomcat-works(中文版).pdf

    Tomcat作为开源社区的重要成果,是Java Web开发者的首选平台之一。本书不仅对初学者友好,也适用于有一定基础的开发者,特别是那些对Java Web应用部署和服务器性能优化感兴趣的读者。 二、Servlet容器工作原理 ...

    Tomcat 配置与优化方案详解

    首先需要了解Tomcat的配置文件——server.xml。它是Tomcat的核心配置文件,包含了多个子元素用于配置Tomcat的各个组件。server.xml文件中的主要元素包括、、和。其中,元素代表整个Catalina容器,是整个配置文件的根...

    tomcat7.0性能优化-挑战极限精简版

    《Tomcat7.0性能优化——挑战极限精简版》 Tomcat作为一款广泛应用的开源Java Servlet容器,其性能优化是许多开发者关注的重点。本文将深入探讨如何对Tomcat7.0进行性能优化,旨在帮助你挑战其运行效率的极限。 一...

    Apache-tomcat-8.5.32(Window64位)

    Tomcat是Apache软件基金会的Jakarta项目的一部分,它实现了Java Servlet、JavaServer Pages (JSP) 和Java EE的Web应用程序部分,即Java EE的轻量级版本——Java EE Web Profile。 Tomcat以其轻便、高效和易用性而...

    技术文档——应用技术等等等等等

    6. **Socket编程与多线程**:在网络编程中,Socket编程用于实现客户端-服务器通信,而多线程则是处理并发请求和优化性能的重要手段。 7. **设计模式**:了解MVC模式、工厂模式、单例模式、接口模式和适配器模式,...

    测试python功能的web项目

    在这个项目中,Tomcat可能是用来运行Python编写的Web应用的一个环境,因为有些开发者可能会选择使用像Flask或Django这样的Python Web框架,并通过Wsgi(Web服务器网关接口)与Tomcat进行通信。这样,Python应用可以...

    Web引擎----简单到掉渣

    【标题】"Web引擎——简单到掉渣"的解析与探讨 在计算机科学领域,Web引擎是用于处理HTTP请求并返回HTML内容的核心组件,它是Web服务器的重要组成部分。本主题将深入浅出地介绍一个简单的Web引擎,以Java编程语言为...

    servlet笔记

    【Servlet笔记】主要涵盖的是JavaWeb开发中的核心技术——Servlet的学习,它是Java EE(现在被称为Jakarta EE)体系中的一部分,用于构建服务器端的Web应用程序。Servlet是Java为处理HTTP请求而设计的一种API,它...

    javaEclipse

    本篇文章将详细讲解如何在Eclipse下配置Windchill进行远程调试,以及涉及到的关键技术点——JPDA。 首先,我们需要在Tomcat服务器上进行配置以开启远程调试功能。在`Tomcat\config.properties`文件中,确保存在以下...

    EJB轻松掌握的八步

    它不仅是SUN公司认证Java程序员(SCJP)与SUN公司认证Java开发员(SCJD)之间的显著区别之一——SCJP考试不涉及EJB内容,而SCJD则将其纳入考核范围;同时也是企业在基于J2EE平台开发电子商务应用系统时不可或缺的...

    java学习教程——简洁易懂,一步步跟随即可上手学习

    - **Tomcat服务器**:Java Web应用的常用服务器,部署和调试Web应用。 9. **Web开发基础** - **Servlet**:Java Web的核心,用于接收和响应HTTP请求。 - **JSP**:动态网页技术,结合HTML和Java代码。 - **MVC...

    ajax 怎么设置超时(一个action执行了2遍)

    这个 `socket_timeout` 值决定了 mod_jk 对 Tomcat 的请求等待时间。由于设置为 5 分钟(300 秒),与 AJAX 请求执行的时间一致,导致了请求被重复发送。将这个值调整到一个更大的值,比如 10 分钟(600 秒),并...

    最新韩顺平_jsp和selverlt原完整版课件_笔记

    随着需求的增长,出现了更高级别的抽象——JSP(Java Server Pages),它允许开发者将业务逻辑与视图层分离,提高了代码的可维护性和可读性。 #### Java EE体系介绍 Java EE是J2EE的后续版本,它进一步发展和完善...

    http-ftp-server

    5. 关闭连接:处理完请求后,关闭`Socket`和`ServerSocket`。 三、FTP服务器基础 FTP是用于Internet上的控制文件的双向传输。它包括两个子系统:控制连接和数据连接。FTP服务器需要管理用户认证、目录浏览、文件...

Global site tag (gtag.js) - Google Analytics