tomcat容器實現類都繼承了containerbase類,容器在啟動的時候都會呼叫containerbase類的threadstart()方法,threadstart()方法如下:
protected void threadstart()
protected class containerbackgroundprocessor implements runnable catch (interruptedexception e)
if (!threaddone)
processchildren(parent, cl);}}
}protected void processchildren(container container, classloader cl)
container.backgroundprocess();
} catch (throwable t) finally
container children = container.findchildren();
for (int i = 0; i < children.length; i++) }}
}
backgroundprocess()方法如下:
public void backgroundprocess() catch (exception e)
}if (loader != null) catch (exception e)
}if (manager != null) catch (exception e)
}if (realm != null) catch (exception e)
}valve current = pipeline.getfirst();
while (current != null) catch (exception e)
current = current.getnext();
}lifecycle.firelifecycleevent(lifecycle.periodic_event, null);
}
在呼叫standcontext類的backgroundprocess()方法時, 會呼叫standardmanager的backgroundprocess()方法,該方法如下:
public void backgroundprocess()
proces***piresfrequency的預設值為6,所以每6*10秒會調一次proces***pires()方法,proces***pires()方法如下:
public void proces***pires()
}long timeend = system.currenttimemillis();
if(log.isdebugenabled())
log.debug("end expire sessions " + getname() + " processingtime " + (timeend - timenow) + " expired sessions: " + expirehere);
processingtime += ( timeend - timenow );
}
該方法主要判斷session是否過期,過期則清除.
整個過程看起來有點複雜,簡單地來說,就是tomcat伺服器在啟動的時候初始化了乙個守護執行緒,定期去檢查有沒有session過期.過期則清除.
Tomcat集群的session共享
第一種是以負載均衡伺服器本身提供的session共享策略,每種服務 器的配置是不一樣的並且nginx本身是沒有的。第二種是利用web容器本身的 session 共享策略來配置共享。針對於 weblogic 這種方式還是靠普的。但是針對於 tomcat 這種方式存在很大的缺陷,主要因為是依靠廣播方式來...
tomcat集群session共享
才疏學淺且語無倫次,如有誤人子弟,深表歉意 一台tomcat不夠用時,要麼換更好的機器,要麼加機器做集群。做集群就會涉及到負載均衡,比如nginx,會把到來的每個請求按一定的規則 給後端tomcat,這就有乙個逃避不了的問題需要解決,使用者的session需要在不同的tomcat之間共享。比較偷懶的...
Tomcat實現Session複製
tomcat實現session複製 需要三颱虛擬機器一台nginx兩台tomcat 關閉相關的安全機制 systemctl stop firewalld iptables f setenforce 0 首先需要將兩台tomcat和一台nginx實現負載均衡 root nginx vim usr lo...