当前位置: 首页 > news >正文

山东省交通厅建设网站如何做网站推广

山东省交通厅建设网站,如何做网站推广,做淘宝客最大的网站是叫什么名字,网站建设二级分销Bootstrap Tomcat运行是通过Bootstrap的main方法,在开发工具中,我们只需要运行Bootstrap的main方法,便可以启动tomcat进行代码调试和分析。Bootstrap是tomcat的入口,它会完成初始化ClassLoader,实例化Catalina以及loa…

Bootstrap

Tomcat运行是通过Bootstrap的main方法,在开发工具中,我们只需要运行Bootstrap的main方法,便可以启动tomcat进行代码调试和分析。Bootstrap是tomcat的入口,它会完成初始化ClassLoader,实例化Catalina以及load、start动作。在这一篇文章中,我们将会对tomcat初始化过程进行分析。

main方法

首先实例化Bootstrap,并调用init方法对其初始化

Bootstrap bootstrap = new Bootstrap();

init

首先初始化commonLoader、catalinaLoader、sharedLoader,默认情况下这三个是相同的实例,用于加载不同的资源。然后,使用反射实例化Catalina,设置其parentClassLoader为sharedLoader

public void init() throws Exception {// 初始化commonLoader、catalinaLoader、sharedLoader,关于ClassLoader的后面再单独分析initClassLoaders();Thread.currentThread().setContextClassLoader(catalinaLoader);SecurityClassLoad.securityClassLoad(catalinaLoader);// 反射方法实例化Catalina,后面初始化Catalina也用了很多反射,不知道意图是什么Class<?> startupClass = catalinaLoader.loadClass("org.apache.catalina.startup.Catalina");Object startupInstance = startupClass.getConstructor().newInstance();// 反射调用setParentClassLoader方法,设置其parentClassLoader为sharedLoaderString methodName = "setParentClassLoader";Class<?> paramTypes[] = new Class[1];paramTypes[0] = Class.forName("java.lang.ClassLoader");Object paramValues[] = new Object[1];paramValues[0] = sharedLoader;Method method =startupInstance.getClass().getMethod(methodName, paramTypes);method.invoke(startupInstance, paramValues);// 引用Catalina实例catalinaDaemon = startupInstance;

load & start

初始化Bootstrap之后,接下来就是加载配置,启动容器。而load、start实际上是由Bootstrap反射调用Catalina的load、start,这一部分代码将在下面的Catalina部分进行分析

  • 启动时,Catalina.setAwait(true),其目的是为了让tomcat在关闭端口阻塞监听关闭命令,参考Catalina.await()方法
  • deamon.load(args),实际上会去调用Catalina#load(args)方法,会去初始化一些资源,优先加载conf/server.xml,找不到再去加载server-embed.xml;此外,load方法还会初始化Server
  • daemon.start(),实例上是调用Catalina.start()
// daemon即Bootstrap实例
daemon.setAwait(true);
daemon.load(args);

Catalina

由前面的分析,可知Bootstrap中的load逻辑实际上是交给Catalina去处理的,下面我们对Catalina的初始化过程进行分析

load(init)

load阶段主要是通过读取conf/server.xml或者server-embed.xml,实例化Server、Service、Connector、Engine、Host等组件,并调用Lifecycle#init()完成初始化动作,以及发出INITIALIZING、INITIALIZED事件

1、 首先初始化jmx的环境变量
2、 定义解析server.xml的配置,告诉Digester哪个xml标签应该解析成什么类,如果我们要改变server.xml的某个属性值(比如优化tomcat线程池),直接查看对应实现类的setXXX方法即可
3、 解析conf/server.xml或者server-embed.xml,并且实例化对应的组件并且赋值操作,比如Server、Container、Connector等等
4、 为Server设置catalina信息,指定Catalina实例,设置catalina的home、base路径
5、 调用StarndServer#init()方法,完成各个组件的初始化,并且由parent组件初始化child组件,一层套一层,这个设计真心牛逼!

public void load() {initDirs();// 初始化jmx的环境变量initNaming();// Create and execute our Digester// 定义解析server.xml的配置,告诉Digester哪个xml标签应该解析成什么类Digester digester = createStartDigester();InputSource inputSource = null;InputStream inputStream = null;File file = null;try {// 首先尝试加载conf/server.xml,省略部分代码......// 如果不存在conf/server.xml,则加载server-embed.xml(该xml在catalina.jar中),省略部分代码......// 如果还是加载不到xml,则直接return,省略部分代码......try {inputSource.setByteStream(inputStream);// 把Catalina作为一个顶级实例digester.push(this);// 解析过程会实例化各个组件,比如Server、Container、Connector等digester.parse(inputSource);} catch (SAXParseException spe) {// 处理异常......}} finally {// 关闭IO流......}// 给Server设置catalina信息getServer().setCatalina(this);getServer().setCatalinaHome(Bootstrap.getCatalinaHomeFile());getServer().setCatalinaBase(Bootstrap.getCatalinaBaseFile());// Stream redirectioninitStreams();// 调用Lifecycle的init阶段try {getServer().init();} catch (LifecycleException e) {// ......}// ......

load时序图如下所示(查看原图):

  • Digester利用jdk提供的sax解析功能,将server.xml的配置解析成对应的Bean,并完成注入,比如往Server中注入Service
  • EngineConfig,它是一个LifecycleListener实现,用于配置Engine,但是只会处理START_EVENT和STOP_EVENT事件
  • Connector默认会有两种:HTTP/1.1、AJP,不同的Connector内部持有不同的CoyoteAdapter和ProtocolHandler,在Connector初始化的时候,也会对ProtocolHandler进行初始化,完成端口的监听
  • ProtocolHandler常用的实现有Http11NioProtocol、AjpNioProtocol,还有apr系列的Http11AprProtocol、AjpAprProtocol,apr系列只有在使用apr包的时候才会使用到
  • 在ProtocolHandler调用init初始化的时候,还会去执行AbstractEndpoint的init方法,完成请求端口绑定、初始化NIO等操作,在tomcat7中使用JIoEndpoint阻塞IO,而tomcat8中直接移除了JIoEndpoint,具体信息请查看org.apache.tomcat.util.net这个包

Catalina在load结束之前,会调用Server的init()完成各个组件的初始化,下面我们来分析下各个组件在init初始化过程中都做了哪些操作

http://www.hkea.cn/news/13988/

相关文章:

  • 网站比较分析域名查询网站入口
  • 英文网站建设情况互联网推广员是做什么
  • app和网站开发区别百度免费发布信息网站
  • 论坛网站如何备案seo交流论坛
  • axure中继器做网站网络营销软文
  • 阜阳做网站网站的设计流程
  • wordpress仿hexo主题常州谷歌优化
  • wordpress 整站加密免费申请网站com域名
  • 互联网网站建设价格百度广告管家
  • 武清做网站的公司成都网站seo报价
  • 中国做b2b外贸的网站网站的推广方式有哪些
  • 山东大禹建设集团网站今日最新的新闻
  • 网站建设与运营的课程总结安徽网络推广和优化
  • 有没有网站是免费做店招图片的游戏推广话术
  • 网站界面设计的步骤沈阳百度seo
  • asp net网站开发构建新发展格局
  • 想学网站建设seo指搜索引擎
  • 山东潍坊疫情名单百度seo排名软
  • 创建一个企业网站流程的步骤系统优化大师
  • 社区门户网站建设招标公告病毒式营销的案例
  • 江都区城乡建设局网站电商培训班一般多少钱
  • 网站栏目怎么做301定向网络软文推广案例
  • 浙江网站建设抖音seo优化nba最新排行
  • 高端网站设计平台联系方式公关服务
  • 一个域名可以绑定几个网站合肥seo网络优化公司
  • 网站建设佰首选金手指十七电商平台引流推广
  • wordpress宝典 pdf北京关键词优化报价
  • wordpress获取文章图片企业网站seo方案案例
  • wordpress 论坛偷笑武汉seo关键词优化
  • 欧美iphonexsmaxseo专员是做什么的