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线程的处理逻辑。

在这里插入图片描述

相关推荐

  1. 替换掉Springboot框架Tomcat使用undertow

    2024-01-13 13:54:04       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-13 13:54:04       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-13 13:54:04       100 阅读
  3. 在Django里面运行非项目文件

    2024-01-13 13:54:04       82 阅读
  4. Python语言-面向对象

    2024-01-13 13:54:04       91 阅读

热门阅读

  1. Pandas实战100例 | 案例 43: 数据排序

    2024-01-13 13:54:04       53 阅读
  2. 根能抵达的节点(二分法、DFS)C++

    2024-01-13 13:54:04       51 阅读
  3. 白学的小知识[css3轮播]

    2024-01-13 13:54:04       53 阅读
  4. Python进程、多进程、线程以及同步和死锁

    2024-01-13 13:54:04       58 阅读
  5. 详细分析Mybatis中的<foreach>标签

    2024-01-13 13:54:04       60 阅读
  6. 微服务入门介绍(二)

    2024-01-13 13:54:04       51 阅读
  7. XTdrone运行ego需打开多个终端 麻烦 一键启动脚本

    2024-01-13 13:54:04       60 阅读