tomcat(3)之StandardServer.java

本文详细解析了Tomcat服务器启动过程中StandardServer类的initialize及start方法执行细节,介绍了如何通过调用这些方法来完成服务器的初始化和服务启动,并分析了生命周期事件的触发机制。
StandarServer.java 所在包package org.apache.catalina.core;
public final class StandardServer
implements Lifecycle, Server, MBeanRegistration
从上节分析可以看到,Catalina.java主要执行了。
server.initialize();
server.start();
我们来看看
server.initialize();主要做了什么.
-----------------------------------------------------------------
/**
* Invoke a pre-startup initialization. This is used to allow connectors
* to bind to restricted ports under Unix operating environments.
*/
public void initialize()
throws LifecycleException
{
if (initialized) {
log.info(sm.getString("standardServer.initialize.initialized"));
return;
}
lifecycle.fireLifecycleEvent(INIT_EVENT, null);
initialized = true;

if( oname==null ) {
try {
oname=new ObjectName( "Catalina:type=Server");
Registry.getRegistry(null, null)
.registerComponent(this, oname, null );
} catch (Exception e) {
log.error("Error registering ",e);
}
}

// Register global String cache
try {
ObjectName oname2 =
new ObjectName(oname.getDomain() + ":type=StringCache");
Registry.getRegistry(null, null)
.registerComponent(new StringCache(), oname2, null );
} catch (Exception e) {
log.error("Error registering ",e);
}

// Initialize our defined Services
for (int i = 0; i < services.length; i++) {
services[i].initialize();
}
}

注:从源码分析,初始化过程,也就是设置一些属性.



我们再来看看.
server.start();
-----------------------------------------------------------------
/**
* Prepare for the beginning of active use of the public methods of this
* component. This method should be called before any of the public
* methods of this component are utilized. It should also send a
* LifecycleEvent of type START_EVENT to any registered listeners.
*
* @exception LifecycleException if this component detects a fatal error
* that prevents this component from being used
*/
public void start() throws LifecycleException {

// 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);

}

注:
1)如果已初始化,将生成日志,说明服务已初始化.
2)通知我们相关的生命周期事件监听器,在启动前
3)通知我们相关的生命周期事件监听器,在启动中
4)启动其它服务器.
5)通知我们相关的生命周期事件监听器,在启动后
从上面代码来看,就是在服务器启动前中后,发送消息给管理生命周期的事件监听器,因此这里关键的问题应是监听器做了什么了.

这里LifecycleListener是一个接口,目前所知道实现类为:
public class AprLifecycleListener
implements LifecycleListener {

位于包:org.apache.catalina.core
如此可以看tomcat的一些核心代码在org.apache.catalina.core,
而org.apache.catalina多是一些接口.
27, 2025 5:31:31 下午 org.apache.coyote.AbstractProtocol init 信息: 初始化协议处理器 ["https-jsse-nio-8443"] 6月 27, 2025 5:31:31 下午 org.apache.catalina.util.LifecycleBase handleSubClassException 严重: 初始化组件[Connector[HTTP/1.1-8443]]失败。 org.apache.catalina.LifecycleException: 协议处理程序初始化失败 at org.apache.catalina.connector.Connector.initInternal(Connector.java:1049) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136) at org.apache.catalina.core.StandardService.initInternal(StandardService.java:556) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136) at org.apache.catalina.core.StandardServer.initInternal(StandardServer.java:1045) at org.apache.catalina.util.LifecycleBase.init(LifecycleBase.java:136) at org.apache.catalina.startup.Catalina.load(Catalina.java:724) at org.apache.catalina.startup.Catalina.load(Catalina.java:746) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.base/java.lang.reflect.Method.invoke(Method.java:568) at org.apache.catalina.startup.Bootstrap.load(Bootstrap.java:302) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:472) Caused by: java.lang.IllegalArgumentException: Invalid keystore format at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:99) at org.apache.tomcat.util.net.AbstractJsseEndpoint.initialiseSsl(AbstractJsseEndpoint.java:71) at org.apache.tomcat.util.net.NioEndpoint.bind(NioEndpoint.java:258) at org.apache.tomcat.util.net.AbstractEndpoint.bindWithCleanup(AbstractEndpoint.java:1204) at org.apache.tomcat.util.net.AbstractEndpoint.init(AbstractEndpoint.java:1217) at org.apache.coyote.AbstractProtocol.init(AbstractProtocol.java:603) at org.apache.coyote.http11.AbstractHttp11Protocol.init(AbstractHttp11Protocol.java:80) at org.apache.catalina.connector.Connector.initInternal(Connector.java:1046) ... 13 more Caused by: java.io.IOException: Invalid keystore format at java.base/sun.security.provider.JavaKeyStore.engineLoad(JavaKeyStore.java:688) at java.base/sun.security.util.KeyStoreDelegator.engineLoad(KeyStoreDelegator.java:221) at java.base/java.security.KeyStore.load(KeyStore.java:1473) at org.apache.tomcat.util.security.KeyStoreUtil.load(KeyStoreUtil.java:69) at org.apache.tomcat.util.net.SSLUtilBase.getStore(SSLUtilBase.java:216) at org.apache.tomcat.util.net.SSLHostConfigCertificate.getCertificateKeystore(SSLHostConfigCertificate.java:207) at org.apache.tomcat.util.net.SSLUtilBase.getKeyManagers(SSLUtilBase.java:282) at org.apache.tomcat.util.net.SSLUtilBase.createSSLContext(SSLUtilBase.java:246) at org.apache.tomcat.util.net.AbstractJsseEndpoint.createSSLContext(AbstractJsseEndpoint.java:97) ... 20 more
最新发布
06-28
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值