`
uule
  • 浏览: 6348682 次
  • 性别: Icon_minigender_1
  • 来自: 一片神奇的土地
社区版块
存档分类
最新评论

HttpConnector 与 HttpProcessor 同步控制

 
阅读更多

HttpConnector 与 HttpProcessor 同步控制

Tomcat学习 HttpConnector和HttpProcessor启动流程和线程交互

 

一些疑问

1、对于assign方法里面的:

  this.socket = socket;

和awai方法里面的:

Socket socket = this.socket;

难于理解。

就是:为什么 await 需要使用一个本地变量(socket)而不是返回实例的 socket 变量呢?

因为这样一来,在当前 socket 被完全处理之前,实例的 socket 变量可以赋给下一个前来的 socket 

 


 

------------HttpProcessor---------------------------

private boolean available = false;
 public HttpProcessor(HttpConnector connector, int id) {

        super();
        this.connector = connector;
        this.debug = connector.getDebug();
        this.id = id;
        this.proxyName = connector.getProxyName();
        this.proxyPort = connector.getProxyPort();
        this.request = (HttpRequestImpl) connector.createRequest();
        this.response = (HttpResponseImpl) connector.createResponse();
        this.serverPort = connector.getPort();
        this.threadName =
          "HttpProcessor[" + connector.getPort() + "][" + id + "]";

    }
 private synchronized Socket await() {

        // Wait for the Connector to provide a new Socket
        while (!available) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }

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

        if ((debug >= 1) && (socket != null))
            log("  The incoming request has been awaited");

        return (socket);

    }
-------------------
public void run() {

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

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

            // Process the request from this socket
            process(socket);

            // Finish up this request
            request.recycle();
            response.recycle();
            connector.recycle(this);

        }

        // Tell threadStop() we have shut ourselves down successfully
        synchronized (threadSync) {
            threadSync.notifyAll();
        }

    }
----------------
synchronized void assign(Socket socket) {

        // Wait for the Processor to get the previous Socket
        while (available) {
            try {
                wait();
            } catch (InterruptedException e) {
            }
        }

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

        if ((debug >= 1) && (socket != null))
            log(" An incoming request is being assigned");

    }

 

 

-------------------HttpConnector-------------------

run(){
// Loop until we receive a shutdown command
        while (!stopped) {

            // Accept the next incoming connection from the server socket
            Socket socket = null;
            try {
                socket = serverSocket.accept();
                if (connectionTimeout > 0)
                    socket.setSoTimeout(connectionTimeout);
            } catch (AccessControlException ace) {
                log("socket accept security exception: " + ace.getMessage());
                continue;
            } catch (IOException e) {
                if (started && !stopped)
                    log("accept: ", e);
                break;
            }

            // Hand this socket off to an appropriate processor
            HttpProcessor processor = createProcessor();
            if (processor == null) {
                try {
                    log(sm.getString("httpConnector.noProcessor"));
                    socket.close();
                } catch (IOException e) {
                    ;
                }
                continue;
            }
            processor.assign(socket);

            // The processor will recycle itself when it finishes

        }

        // Notify the threadStop() method that we have shut ourselves down
        synchronized (threadSync) {
            threadSync.notifyAll();
        }
}
  -----------------    
   private HttpProcessor createProcessor() {

        synchronized (processors) {
            if (processors.size() > 0)
                return ((HttpProcessor) processors.pop());
            if ((maxProcessors > 0) && (curProcessors < maxProcessors)) {
                return (newProcessor());
            } else {
                if (maxProcessors < 0) {
                    return (newProcessor());
                } else {
                    return (null);
                }
            }
        }

    }
------------------------
private HttpProcessor newProcessor() {

        HttpProcessor processor = new HttpProcessor(this, curProcessors++);
        if (processor instanceof Lifecycle) {
            try {
                ((Lifecycle) processor).start();
            } catch (LifecycleException e) {
                log("newProcessor", e);
                return (null);
            }
        }
        created.addElement(processor);
        return (processor);

    }

 ...

 

 

分享到:
评论
1 楼 laj12347 2016-03-14  
感觉着两个原因都说的比较牵强, 第一处的await 方法中取出来的soket本来就是当前 处理器中的变量。

assign 中的wait方法,和唤醒方法可能是防止意外情况的发生。

相关推荐

    confluent实时同步sqlserver数据debezium-connector-sqlserver.zip

    sql server2008 cdc 数据实时同步到kafka,Debezium是捕获数据实时动态变化的开源的分布式同步平台。能实时捕获到数据源(Mysql、Mongo、PostgreSql)的:新增(inserts)、更新(updates)、删除(deletes)操作,实时...

    使用flink-connector-sqlserver-cdc 2.3.0把数据从SQL Server实时同步到MySQL中

    总之,通过Flink-connector-sqlserver-cdc 2.3.0,我们可以轻松地构建一个实时数据同步系统,将SQL Server数据库的变化实时同步到MySQL。理解并掌握上述步骤和概念,对于实现高效、稳定的数据流处理至关重要。

    Java开发springboot-整合mysql-binlog-connector-java实现MySQL数据同步-源代码+文档

    Java开发springboot-整合mysql-binlog-connector-java实现MySQL数据同步-源代码+文档 Java开发springboot-整合mysql-binlog-connector-java实现MySQL数据同步-源代码+文档 Java开发springboot-整合mysql-binlog-...

    my-servlet:自己书写的servlet,仿照servlet

    我的小服务器 自己书写的servlet,仿照servlet源码 ex03 本章的应用程序所包含的...区别于与从java.net.ServerSocket类accept()方法接收一个替代,创建一个HttpProcessor实时并发生。该专有,调用其parse方法。 H

    大数据-flink-mysql-connector:用于flinkcdc实时同步

    flinkc-sql-connector-mysql,用于mysql数据实时同步

    mongoconnector

    该工具在MongoDB与目标系统间同步数据,并跟踪MongoDB的oplog,保持操作与MongoDB的实时同步。用于连接MongoDB的插件,搭建的时候,遇到不少阻力,搭建时竟然保证版本的对应性。其次mongo connector的同步效率并不...

    canal实现mysql到ES数据实时同步

    MySQL到Elasticsearch(ES)的数据实时同步是大数据领域中常见的需求,用于实现实时数据分析和检索。Canal是一款由阿里巴巴开源的数据库增量日志抽取工具,它能够监听MySQL的数据变更,然后将这些变更实时地同步到...

    proxy_http_connector.rar_http proxy

    A HttpConnector implements a non-HTTP proxied connection through the CONNECT method.

    clickhouse--kafka引擎接入同步表.docx

    3. Kafka-ClickHouse Connector:负责将Kafka中的数据同步到ClickHouse中。 ClickHouse-Kafka引擎接入同步表的优点 使用ClickHouse-Kafka引擎接入同步表有以下几个优点: 1. 实时数据同步:ClickHouse-Kafka引擎...

    DBSyncer是一款开源的数据同步中间件

    组合驱动,自定义库同步到库组合,关系型数据库与非关系型之间组合,任意搭配表同步映射关系 实时监控,驱动全量或增量实时同步运行状态、结果、同步日志和系统日志 开发插件,自定义转化同步逻辑

    winmobile手机同步演示

    通过以上介绍,我们可以理解WinMobile手机同步演示的核心是利用特定的同步工具(如ActiveSync)将手机数据与PC进行同步,而"PockontroPro.exe"可能是用于演示控制的辅助工具。随着科技的发展,现代设备的同步方式...

    一款开源的数据同步中间件提供MySQL、Oracle、SqlServer、Postgre,File,kafka,SQL等同步场景

    DBSyncer(简称dbs)是一款开源的数据同步中间件,提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景。支持上传插件自定义同步转换业务,提供监控全量和增量数据统计图、...

    mysql表结构同步[源代码]

    此外,对于大型数据库或频繁变动的表结构,还可以考虑使用数据库版本控制工具,如 Liquibase 或 Flyway,它们能更系统地管理数据库结构的变更,并提供自动化同步功能。 总之,MySQL表结构同步是数据库管理的重要...

    DBSyncer数据同步工具

    DBSyncer(英[dbsɪŋkɜː(r)],美[dbsɪŋkɜː(r) 简称dbs)是一款开源的数据同步中间件,提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景。支持上传插件自定义同步...

    tomcat+comet实现终端与服务端同步的小例子

    【标题】:“Tomcat+Comet 实现终端与服务端同步的小例子” 在这个主题中,我们将探讨如何使用Apache Tomcat服务器和Comet技术来实现浏览器客户端与服务端的实时通信。Comet是一种Web应用程序设计模式,它允许数据...

    firefox-connector

    3. **云服务整合**:与JetBrains的其他产品(如GitLab、GitHub、Bitbucket等)整合,实现代码版本控制和协作。 4. **安全增强**:提供额外的隐私保护措施,比如阻止跟踪脚本,提高在线浏览的安全性。 5. **用户界面...

    svn connector

    在Eclipse中安装SVN Connector是必不可少的步骤,因为它是Eclipse与SVN之间的桥梁,使得开发者能够在Eclipse内部直接进行版本控制操作,如添加、删除、更新、提交文件,以及查看文件历史和解决合并冲突等。...

    apr库(tomcat优化) for native 20

    它又分为BIO Http Connector与NIO Http Connector两种,后者提供非阻塞IO与长连接Comet支持。  AJP Connector, 基于AJP协议,AJP是专门设计用来为tomcat与http服务器之间通信专门定制的协议,能提供较高的通信速度...

Global site tag (gtag.js) - Google Analytics