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); }
...
相关推荐
sql server2008 cdc 数据实时同步到kafka,Debezium是捕获数据实时动态变化的开源的分布式同步平台。能实时捕获到数据源(Mysql、Mongo、PostgreSql)的:新增(inserts)、更新(updates)、删除(deletes)操作,实时...
总之,通过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-...
我的小服务器 自己书写的servlet,仿照servlet源码 ex03 本章的应用程序所包含的...区别于与从java.net.ServerSocket类accept()方法接收一个替代,创建一个HttpProcessor实时并发生。该专有,调用其parse方法。 H
flinkc-sql-connector-mysql,用于mysql数据实时同步
该工具在MongoDB与目标系统间同步数据,并跟踪MongoDB的oplog,保持操作与MongoDB的实时同步。用于连接MongoDB的插件,搭建的时候,遇到不少阻力,搭建时竟然保证版本的对应性。其次mongo connector的同步效率并不...
MySQL到Elasticsearch(ES)的数据实时同步是大数据领域中常见的需求,用于实现实时数据分析和检索。Canal是一款由阿里巴巴开源的数据库增量日志抽取工具,它能够监听MySQL的数据变更,然后将这些变更实时地同步到...
A HttpConnector implements a non-HTTP proxied connection through the CONNECT method.
3. Kafka-ClickHouse Connector:负责将Kafka中的数据同步到ClickHouse中。 ClickHouse-Kafka引擎接入同步表的优点 使用ClickHouse-Kafka引擎接入同步表有以下几个优点: 1. 实时数据同步:ClickHouse-Kafka引擎...
组合驱动,自定义库同步到库组合,关系型数据库与非关系型之间组合,任意搭配表同步映射关系 实时监控,驱动全量或增量实时同步运行状态、结果、同步日志和系统日志 开发插件,自定义转化同步逻辑
DBSyncer(简称dbs)是一款开源的数据同步中间件,提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景。支持上传插件自定义同步转换业务,提供监控全量和增量数据统计图、...
通过以上介绍,我们可以理解WinMobile手机同步演示的核心是利用特定的同步工具(如ActiveSync)将手机数据与PC进行同步,而"PockontroPro.exe"可能是用于演示控制的辅助工具。随着科技的发展,现代设备的同步方式...
此外,对于大型数据库或频繁变动的表结构,还可以考虑使用数据库版本控制工具,如 Liquibase 或 Flyway,它们能更系统地管理数据库结构的变更,并提供自动化同步功能。 总之,MySQL表结构同步是数据库管理的重要...
【标题】:“Tomcat+Comet 实现终端与服务端同步的小例子” 在这个主题中,我们将探讨如何使用Apache Tomcat服务器和Comet技术来实现浏览器客户端与服务端的实时通信。Comet是一种Web应用程序设计模式,它允许数据...
3. **云服务整合**:与JetBrains的其他产品(如GitLab、GitHub、Bitbucket等)整合,实现代码版本控制和协作。 4. **安全增强**:提供额外的隐私保护措施,比如阻止跟踪脚本,提高在线浏览的安全性。 5. **用户界面...
在Eclipse中安装SVN Connector是必不可少的步骤,因为它是Eclipse与SVN之间的桥梁,使得开发者能够在Eclipse内部直接进行版本控制操作,如添加、删除、更新、提交文件,以及查看文件历史和解决合并冲突等。...
DBSyncer(英[dbsɪŋkɜː(r)],美[dbsɪŋkɜː(r) 简称dbs)是一款开源的数据同步中间件,提供MySQL、Oracle、SqlServer、PostgreSQL、Elasticsearch(ES)、Kafka、File、SQL等同步场景。支持上传插件自定义同步...
它又分为BIO Http Connector与NIO Http Connector两种,后者提供非阻塞IO与长连接Comet支持。 AJP Connector, 基于AJP协议,AJP是专门设计用来为tomcat与http服务器之间通信专门定制的协议,能提供较高的通信速度...