Tomcat的NioEndPoint中ConcurrentLinkedQueue的使用

首先介绍Tomcat的容器结构以及NioEndPoint的作用,以便后面能够更加平滑地切入话题,如图所示是Tomcat的容器结构。

Connector是一个桥梁,它把Server和Engine连接了起来,Connector的作用是接受客户端的请求,然后把请求委托给Engine容器处理。

在Connector的内部具体使用Endpoint进行处理,根据处理方式的不同Endpoint可分为NioEndpoint、JIoEndpoint、AprEndpoint。

首先来看NioEndpoint中的三大组件的关系图。

  • Acceptor是套接字接受线程(Socket acceptor thread),用来接受用户的请求,并把请求封装为事件任务放入Poller的队列,一个Connector里面只有一个Acceptor。
  • Poller是套接字处理线程(Socket poller thread),每个Poller内部都有一个独有的队列,Poller线程则从自己的队列里面获取具体的事件任务,然后将其交给Worker进行处理。
  • Worker是实际处理请求的线程,Worker只是组件名字,真正做事情的是SocketProcessor,它是Poller线程从自己的队列获取任务后的真正任务执行者。

可见,Tomcat使用队列把接受请求与处理请求操作进行解耦,实现异步处理。其实Tomcat中NioEndPoint中的每个Poller里面都维护一个ConcurrentLinkedQueue,用来缓存请求任务,其本身也是一个多生产者-单消费者模型。

生产者------Acceptor线程

Acceptor线程的作用是接受客户端发来的连接请求并将其放入Poller的事件队列。首先看下Acceptor处理请求的简明时序图。

消费者------Poller线程

Poller线程的作用是从事件队列里面获取事件并进行处理。首先我们从时序图来全局了解下Poller线程的处理逻辑。

相关推荐
逻辑驱动的ken2 分钟前
Java高频面试考点场景题22
java·开发语言·jvm·面试·职场和发展·求职招聘·春招
小则又沐风a8 分钟前
list模拟实现
java·服务器·list
上弦月-编程11 分钟前
C语言链表详解,新手也能看懂! ——从入门到精通的完整教程
java·c语言·c++
ffqws_24 分钟前
Spring Boot 配置读取全解析:从 application.yml 到 Java 对象的完整链路
java·数据库·spring boot
clear sky .25 分钟前
【TCP】TCP数据粘包/分包问题
java·服务器·网络
云烟成雨TD26 分钟前
Spring AI 1.x 系列【29】Embedding Model(嵌入模型)
java·人工智能·spring
幸福巡礼35 分钟前
【 LangChain 1.2 实战(四)】构建一个模块化的天气查询 Agent
java·前端·langchain
wuminyu10 小时前
专家视角看Java字节码加载与存储指令机制
java·linux·c语言·jvm·c++
callJJ11 小时前
Spring Data Redis 两种编程模型详解:同步 vs 响应式
java·spring boot·redis·python·spring
wbs_scy12 小时前
Linux线程同步与互斥(三):线程同步深度解析之POSIX 信号量与环形队列生产者消费者模型,从原理到源码彻底吃透
java·开发语言