TOMCAT以一个责任链贯穿Server的启动过程。首先是读取配置文件、由Server启动一个service,由service把connector和container组装起来对外界提供服务。
在tomcat6中connector包括三种不同的connector:
1、Http Connector 基于HTTP协议,负责建立HTTP连接。它又分为BIO Http Connector与NIO Http Connector两种,后者提供非阻塞IO与长连接Comet支持。
2、AJP Connector, 基于AJP协议,AJP是专门设计用来为tomcat与http服务器之间通信专门定制的协议,能提供较高的通信速度和效率。如与Apache服务器集成时,采用这个协议。
3、APR HTTP Connector, 用C实现,通过JNI调用的。主要提升对静态资源(如HTML、图片、CSS、JS等)的访问性能。现在这个库已独立出来可用在任何项目中。Tomcat在配置APR之后性能非常强劲
Container 是容器的父接口,所有子容器都必须实现这个接口,Container 容器的设计最能体现责任链的设计模式;它有四个子容器组件构成,分别是:Engine、Host、Context、Wrapper。这四个组件不是平行的,而是父子关系, Engine 包含 Host,Host 包含 Context,Context 包含 Wrapper,
通常一个 Servlet class 对应一个 Wrapper,如果有多个 Servlet 就可以定义多个 Wrapper
在启动的过程中service责任链的下一个节点是Engine,再下一个节点是Host、然后context。
等所有的容器都初始化完成了,tomcat也就启动完成
然而贯穿整个启动过程的责任链由一个简单的接口来实现:lifecycle
lifecycle实际上就是观察者模式中的被观察者 规范了生命周期组件的状态和操作方法
lifecycleListener 监听接口 实际上就是观察者模式中的观察者 监听在生命周期组件的各种状态变化
LifecycleEvent 事件定义接口 可以通过构造函数构造生命周期中的任何一个状态
1、bootstrap.main
启动的入口
2、catalina.init
加载类库 初始化守护线程
if (daemon == null) {
daemon = new Bootstrap();
try {
daemon.init();
} catch (Throwable t) {
t.printStackTrace();
return;
}
}
3、catalina.load
catalina就是tomcat的守护线程 load方法加载server.xml配置文档 加载责任链相关的监听信息
daemon.setAwait(true);
daemon.load(args);
daemon.start();
4、catalina.start
启动StandardServer.start方法
// Start the new server
if (getServer() instanceof Lifecycle) {
try {
((Lifecycle) getServer()).start();
} catch (LifecycleException e) {
log.error("Catalina.start: ", e);
}
}
5、StandardServer.start
从这里开始 启动责任链 启动的之前先触发before_start动作、然后触发start动作、接着启动下级容器standardService、然后触发after_start动作
// Validate and update our current component state
if (started) {
log.debug(sm.getString("standardServer.start.started"));
return;
}
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);
lifecycle.fireLifecycleEvent(START_EVENT, null);
started = true;
// Start our defined Services
synchronized (services) {
for (int i = 0; i < services.length; i++) {
if (services[i] instanceof Lifecycle)
((Lifecycle) services[i]).start();
}
}
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
6、standardService.start
先触发before_start动作、然后触发start动作、接着启动下级容器StandardEngine、启动连接器[Connector[HTTP/1.1-8080], Connector[AJP/1.3-8009]]、然后触发after_start动作
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);
if(log.isInfoEnabled())
log.info(sm.getString("standardService.start.name", this.name));
lifecycle.fireLifecycleEvent(START_EVENT, null);
started = true;
// Start our defined Container first
if (container != null) {
synchronized (container) {
if (container instanceof Lifecycle) {
((Lifecycle) container).start();
}
}
}
synchronized (executors) {
for ( int i=0; i<executors.size(); i++ ) {
executors.get(i).start();
}
}
// Start our defined Connectors second
synchronized (connectors) {
for (int i = 0; i < connectors.length; i++) {
try {
((Lifecycle) connectors[i]).start();
} catch (Exception e) {
log.error(sm.getString(
"standardService.connector.startFailed",
connectors[i]), e);
}
}
}
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
7、standardEngine.start
补充说明一下standardEngine、StandardHost、StandardContext都继承了ContainerBase类 ContainerBase类中重写了start方法 standardEngine只要调用super.start() 。容器ContainerBase会递归启动standardEngine下的所有子容器
// Standard container startup
super.start();
8、containerBase.start
containerBase.start方法里面除了启动下级子容器外还做了不少动作 例如日志组件、集群功能加载、启动容器后台守护线程
// Validate and update our current component state
if (started) {
if(log.isInfoEnabled())
log.info(sm.getString("containerBase.alreadyStarted", logName()));
return;
}
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(BEFORE_START_EVENT, null);
started = true;
// Start our subordinate components, if any
if ((loader != null) && (loader instanceof Lifecycle))
((Lifecycle) loader).start();
logger = null;
getLogger();
if ((logger != null) && (logger instanceof Lifecycle))
((Lifecycle) logger).start();
if ((manager != null) && (manager instanceof Lifecycle))
((Lifecycle) manager).start();
if ((cluster != null) && (cluster instanceof Lifecycle))
((Lifecycle) cluster).start();
if ((realm != null) && (realm instanceof Lifecycle))
((Lifecycle) realm).start();
if ((resources != null) && (resources instanceof Lifecycle))
((Lifecycle) resources).start();
// Start our child containers, if any
Container children[] = findChildren();
for (int i = 0; i < children.length; i++) {
if (children[i] instanceof Lifecycle)
((Lifecycle) children[i]).start();
}
// Start the Valves in our pipeline (including the basic), if any
if (pipeline instanceof Lifecycle)
((Lifecycle) pipeline).start();
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(START_EVENT, null);
// Start our thread
threadStart();
// Notify our interested LifecycleListeners
lifecycle.fireLifecycleEvent(AFTER_START_EVENT, null);
StandardHost.start
StandardContext.start
分享到:
相关推荐
Bootstrap是一个流行的前端框架,用于快速构建响应式和移动优先的网站,而这里提到的问题实际上与Bootstrap框架无关,而是与Tomcat服务器启动时的classpath配置相关。 标题中的“解决bootstrap路径问题”实际上是指...
Tomcat的启动流程主要包括以下几个步骤: 1. **启动脚本解析** - 启动过程从解析位于`<CATALINA_HOME>/bin`目录下的`.bat`或`.sh`文件开始。 - 在Windows环境下,通常使用`startup.bat`脚本来启动Tomcat。 - ...
通过以上步骤,我们详细了解了 Tomcat 6.0 启动的基本流程和关键类之间的关系。从 `Bootstrap` 类开始,逐步初始化类加载器、加载配置文件,直到启动服务器并监听端口,最终形成一个完整的 Tomcat 启动过程。这一...
Bootstrap类是Tomcat的启动入口。 3. **添加VM参数**:在" Arguments "选项卡中,添加以下虚拟机参数: - `-Xdebug`: 启用JVM调试。 - `-Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=n`: 这些...
使用Tomcat通常涉及以下几个步骤: 1. **安装**:将解压后的目录放置在服务器上适当的位置,并配置环境变量。 2. **配置**:根据需要修改`conf/server.xml`等配置文件。 3. **部署应用**:将Web应用的WAR文件放入`...
标题中的“免安装版...了解这些步骤后,你就能在Windows系统上设置免安装版Tomcat的开机自启动,确保服务器在需要时始终可用。注意,不同的Tomcat版本可能涉及的文件和参数会有所不同,但基本原理和过程是相似的。
总结一下,无插件启动Tomcat并在Eclipse中调试,主要涉及以下几个关键步骤:配置Tomcat运行环境,创建Server实例,修改server.xml以开启调试,导入必要的库,以及设置调试配置。这种方法虽然比使用插件复杂,但在...
2. **配置Wrapper配置文件**:JSW或WinSW有自己的配置文件,例如`wrapper.conf`,你需要在此文件中指定Tomcat的主类(如`org.apache.catalina.startup.Bootstrap`)、JVM参数和启动选项。 3. **配置Tomcat**:可能...
通过以上步骤的操作,通常可以有效解决“Tomcat一闪”的问题,确保Tomcat能够正常启动并运行。需要注意的是,在实际操作过程中,还需要结合具体的错误信息和实际情况进行灵活调整,以便找到最合适的解决方案。
6. 在`wrapper.conf`文件中,你需要配置Tomcat的启动参数,包括Java的主类(通常是`org.apache.catalina.startup.Bootstrap`),JVM路径,以及任何其他特定于应用的环境变量或系统属性。 7. 完成配置后,运行`...
总结起来,安装Tomcat7的关键步骤包括安装JDK,设置环境变量,解压并移动Tomcat,启动Tomcat服务,以及验证Tomcat的运行状态。在整个过程中,确保遵循最佳实践,如合理选择安装目录,正确配置环境变量,以及安全地...
总之,配置Tomcat环境需要正确安装JDK,设置相应的环境变量,并确保Tomcat能够正常启动和处理请求。通过遵循上述步骤,你可以顺利地搭建起一个本地的Tomcat服务器,为你的Web应用程序提供运行平台。
进入Tomcat的bin目录,使用如下命令启动Tomcat: ``` cd $CATALINA_HOME ./bin/jsvc -cp ./bin/bootstrap.jar:./bin/tomcat-juli.jar \ -outfile ./logs/catalina.out -errfile ./logs/catalina.err \ org....
描述中提到的具体安装步骤可能参考了一个CSDN博客文章,虽然具体内容没有提供,但通常集成Eureka到Tomcat中会涉及以下步骤: 1. **环境准备**:确保你已经安装了Java Development Kit (JDK) 和Apache Tomcat。...
当接收到客户端请求后,Tomcat会按照以下步骤处理请求: 1. **Connector**接收客户端请求; 2. **Processor**将请求分发给对应的Container; 3. **Container**根据请求路径查找对应的Web应用; 4. **Web应用**中的...
通常,安装教程会涵盖环境配置(如Java环境、MySQL安装)、项目构建(如Maven或Gradle)、数据库初始化、应用服务器部署(如Tomcat或Jetty)以及启动和运行应用的步骤。 从压缩包子文件的文件名称“beetl-bbs”来看...
- 完成上述步骤后,重启Tomcat以应用新的配置。 #### 效果验证与后续管理 1. **效果验证**: - 重启Tomcat后,日志文件应被正确地按日期进行分割。 - 输出的Log文件格式为`catalina.out.2017-09-07`等。 2. **...
2. **加载Classpath**:在启动脚本中,通过关键字`CLASSPATH`指定`bin\bootstrap.jar`等JAR包的位置,这些JAR包包含了启动Tomcat所需的类和资源。 3. **主类加载**:脚本中通过关键字`MAINCLASS`指定了主类`org....