[Jetty9.3]-Jetty的NIO调度:ManagedSelector

ManagedSelector是整个Jetty NIO的核心实现

  • 它是SelectorManger的内部类, 本质上封装了java.nio.channels.Selector
  • 每个ManagedSelector存在PROCESSING, SELECTING和LOCKED三种状态
  • ManagerdSelector实现了Runnable, 在run体中while一个select()函数.
  • ManagerdSelector#submit()是唯一其他对象(线程)用于提交可执行任务的函数.

ManagedSelector状态机解读

  • ManagedSelector内部通过一个AtomicReference类型的state变量解决多线程间的状态统一问题.
  • 在PROCESSING状态时, MS会处理_runChanges列表中的任务(串行的)或者处理selectedKeys
  • 如果#submit方法获得LOCKED状态, 则会往_addChanges列表中添加任务, 然后立马将状态切换到PROCESS
  • 如果#select方法获得LOCKED状态, 则尝试将_addChanges switch到_runChanges中, 然后立马将状态切换到PROCESS
  • 如果所有任务(_runChanges)都跑完了, 那么#select方法就会调用NIO的selector等待网络事件了.

ManagedSelector的Change

 1 loop: while(true)
 2 {
 3     State state=_state.get();
 4     switch (state)
 5     {
 6         case PROCESSING:
 7             // We can loop on _runChanges list without lock, because only access here.
 8             int size = _runChanges.size();
 9             for (int i=0;i<size;i++)
10                 runChange(_runChanges.get(i));
11             _runChanges.clear();

正如上边说的, 在PROCESSING状态时会将_runChanges中任务都跑一遍, 是一个for循环也就是串行的.

 1 protected void runChange(Runnable change)
 2 {
 3     try
 4     {
 5         if (LOG.isDebugEnabled())
 6             LOG.debug("Running change {}", change);
 7         change.run();
 8     }
 9     catch (Throwable x)
10     {
11         LOG.debug("Could not run change " + change, x);
12     }
13 }

runChange函数就没啥, 直接调Runnable的run方法, 也就是说也是同步的.

ManagedSelector其实一共就这些Change, 其中就常见的就是Acceptor用于Server监听(listen)连接请求, Accept用于处理请求连接并在Selectkey上attach Jetty另外一个重要的对象:EndPoint.

图1 select()函数内部状态图

时间: 2024-10-14 18:30:03

[Jetty9.3]-Jetty的NIO调度:ManagedSelector的相关文章

从Jetty、Tomcat和Mina中提炼NIO构架网络服务器的经典模式

转自:http://blog.csdn.net/cutesource/article/details/6192016 http://blog.csdn.net/cutesource/article/details/6192145 http://blog.csdn.net/cutesource/article/details/6192163 如何正确使用NIO来构架网络服务器一直是最近思考的一个问题,于是乎分析了一下Jetty.Tomcat和Mina有关NIO的源码,发现大伙都基于类似的方式,我感

Jetty 9嵌入式开发

官方网址:http://www.eclipse.org/jetty/ 下载地址:http://download.eclipse.org/jetty/stable-9/dist/ 文档网址:http://www.eclipse.org/jetty/documentation/ 当前Jetty网址上推荐使用的稳定版本:Jetty9.0. 介绍 Jetty9内容位于http://www.eclipse.org/jetty/documentation. 直接链接: http://www.eclipse.

jetty 在请求URI里传入非法字符,jetty会断开连接,导致nginx认为该节点不健康

jetty 在请求URI里传入非法字符(如直接一个16进制字节A1,非%A1,用抓包TCP工具发送),jetty抛出如下错误 8.1.0.RC1. 8.1.18.v20150929. 9.3好的 如果前面代理用nginx的proxy_next_upstream,会认为该节点失效,如果请求刷的厉害,有可能所有节点都被刷成不健康状态:导致nginx返回给用户502: org.eclipse.jetty.util.Utf8Appendable$NotUtf8Exception: Not valid U

Jetty使用教程(一)——开始使用Jetty

一.Jetty简介 1.1 什么是Jetty Jetty是一个提供HHTP服务器.HTTP客户端和javax.servlet容器的开源项目. 这个入门教程分为五个部分: 第一部分部分重点介绍如何使用Jetty,它提供如下信息,如什么是Jetty,从哪可以下载它,怎么在像Maven一样的仓库中找到它.这一部分同样会提供启动Jetty和如何配置Jetty的快速入门. 第二部分从更细致的方面介绍Jetty的配置,介绍怎么用Jetty来部署一个web应用程序,怎么配置容器和连接,以及如何实现SSL和其它

如何通过Maven的Jetty插件运行Web工程

首先建议使用jetty9,因为据官方文档显示,Jetty 7 and Jetty 8 are now EOL (End of Life),如下.但是由于项目使用的版本一般都比较低,这里以jetty8为例. Version Servlet Java Namespace Licenses Site Status Jetty 9 Servlet 3.1 Java 1.8 org.eclipse.jetty.* EPLv1 /ASLv2 Eclipse.org Stable Release Jetty

菜鸟学Java(十九)——WEB项目测试好帮手,Maven+Jetty

做WEB开发,测试是一件很费时间的事情.所以我们就应该用更简单.更快捷的方式进行测试.今天就向大家介绍一个轻量级的容器--jetty.j今天说的etty是Maven的一个插件jetty-maven-plugin,与Maven配合起来使用非常的方便,它的配置也非常的简单,下面我们就看看它怎么用吧! 在pom.xml 文件的<project>标签下加入如下代码: <build> <plugins> <plugin> <groupId>org.mort

Jetty安装学习并展示

Jetty 的基本架构 Jetty 目前的是一个比较被看好的 Servlet 引擎,它的架构比较简单,也是一个可扩展性和非常灵活的应用服务器,它有一个基本数据模型,这个数据模型就是 Handler,所有可以被扩展的组件都可以作为一个 Handler,添加到 Server 中,Jetty 就是帮你管理这些 Handler. 下图是 Jetty 的基本架构图,整个 Jetty 的核心组件由 Server 和 Connector 两个组件构成,整个 Server 组件是基于 Handler 容器工作的

maven jetty

<plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId> <version>7.1.6.v20100715</version> <configuration> <webApp>${basedir}/target/backbone-runtime-web2</webApp&g

How to add and configure jetty server in maven pom.xml

Jetty server configuration will be added as a maven plugin <!--Jetty config--><build> <pluginManagement> <plugins> <plugin> <groupId>org.mortbay.jetty</groupId> <artifactId>jetty-maven-plugin</artifactId&