memcached session manager(MSM) 用集中式缓存方式解决了集群环境的session共享
MSM用MemcachedBackupSessionManager类替换了StandardManager
1 MSM通过两个Valve拦截Request请求实现了对Session的操作
RequestTrackingHostValve
RequestTrackingContextValve
这两个Valve是在startInternal()方法中加载的 如下代码
_trackingHostValve = new RequestTrackingHostValve(_requestUriIgnorePattern, sessionCookieName, this, _statistics, _enabled, _currentRequest);
_manager.getContainer().getParent().getPipeline().addValve(_trackingHostValve);
_trackingContextValve = new RequestTrackingContextValve(sessionCookieName, this);
_manager.getContainer().getPipeline().addValve( _trackingContextValve );
先看RequestTrackingHostValve做了什么?
@Override
public void invoke( final Request request, final Response response ) throws IOException, ServletException {
final String requestId = getURIWithQueryString( request );
if(!_enabled.get() || !_msmContext.equals(request.getContext())) {
getNext().invoke( request, response );
} else if ( _ignorePattern != null && _ignorePattern.matcher( requestId ).matches() ) {
if(_log.isDebugEnabled()) {
_log.debug( ">>>>>> Ignoring: " + requestId + " (requestedSessionId "+ request.getRequestedSessionId() +") ==================" );
}
try {
storeRequestThreadLocal( request );
request.setNote(REQUEST_IGNORED, Boolean.TRUE);
getNext().invoke( request, response );
} finally {
if(request.getNote(REQUEST_PROCESSED) == Boolean.TRUE) {
final String sessionId = getSessionId(request, response);
if(sessionId != null) {
_sessionBackupService.requestFinished(sessionId, requestId);
}
}
resetRequestThreadLocal();
}
if(_log.isDebugEnabled()) {
_log.debug( "<<<<<< Ignored: " + requestId + " ==================" );
}
} else {
request.setNote(REQUEST_PROCESS, Boolean.TRUE);
if ( _log.isDebugEnabled() ) {
_log.debug( ">>>>>> Request starting: " + requestId + " (requestedSessionId "+ request.getRequestedSessionId() +") ==================" );
}
//请求开始,注意这里并没有从memcached获取session,而是在用户调用request.getSession()才从memcached获取
try {
storeRequestThreadLocal( request ); //保存request到ThreadLocal
getNext().invoke( request, response ); //调用下一个Valve
} finally {
final Boolean sessionIdChanged = (Boolean) request.getNote(SESSION_ID_CHANGED);
//在请求结束时保存session到memcached
backupSession( request, response, sessionIdChanged == null ? false : sessionIdChanged.booleanValue() );
resetRequestThreadLocal();
}
if ( _log.isDebugEnabled() ) {
logDebugRequestSessionCookie( request );
logDebugResponseCookie( response );
_log.debug( "<<<<<< Request finished: " + requestId + " ==================" );
}
}
}
分享到:
相关推荐
第一章 走进linux 1.1 GNU与Linux的成长 ...1.7 Linux内核源代码分析工具 1.7.1 Linux超文本交叉代码检索工具 1.7.2 Windows平台下的源代码阅读工具Source Insight 第二章 Linux运行的硬件基
资源名:基于马尔科夫转换多重分形预测模型_MSM模型_捕捉金融时间序列波动中隐藏的离群值、时间标度以及长程相关性特征_matlab 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功...
Android 源代码包目录结构分析是 Android 开发者必须了解的一部分。这篇文章将详细介绍 Android 源代码包目录结构,帮助开发者更好地理解 Android 的内部机理。 Android 源代码包目录结构主要分为以下几个部分: ...
....\恒流源差分放大电路×共模特性测试电路.msm ....\戴维南验证.msm ....\放大电路频谱测量.msm ....\数字逻辑电路 ....\............\74LS138D译码器组一位全加器.msm ....\............\74LS138D-全加器....
1.5 分析Linux内核源代码很有必要 14 1.5.1 源代码目录结构 14 1.5.2 浏览源代码的工具 16 1.5.3 为什么用汇编语言编写内核代码 17 1.5.4 Linux内核的显著特性 18 1.5.5 学习Linux内核的...
1.5 分析Linux内核源代码很有必要 14 1.5.1 源代码目录结构 14 1.5.2 浏览源代码的工具 16 1.5.3 为什么用汇编语言编写内核代码 17 1.5.4 Linux内核的显著特性 18 1.5.5 学习Linux内核的...
1.5 分析Linux内核源代码很有必要 14 1.5.1 源代码目录结构 14 1.5.2 浏览源代码的工具 16 1.5.3 为什么用汇编语言编写内核代码 17 1.5.4 Linux内核的显著特性 18 1.5.5 学习Linux内核的...
该存储库提供了代码源,可重现我们的HIV传播模型中的分析,该分析评估了三种临床HIV PrEP干预措施对与男性发生性关系的男性中HIV发生率的影响。引文Jenness SM,Knowlton G,Smith DK,Marcus JL,Anderson EJ,...
软件:Maltab 资源内容: 使用maltab软件实现声音降噪处理以及麦克风阵列声源定位,可用于... 简述实现方法:使用DMA时分复用获取3组I2S麦克风数据到内部SRAM,定位算法通过分析一轮获取数据最大值的位置确定定位方向。
全书分为19章,依次讲解驱动移植的必要性,何为HAL层深入分析,Goldfish、MSM、MAP内核和驱动解析,显示系统、输入系统、振动器系统、音频系统、视频输出系统的驱动,OpenMax多媒体、多媒体插件框架,传感器、照相机...
全书分为19章,依次讲解驱动移植的必要性,何为HAL层深入分析,Goldfish、MSM、MAP内核和驱动解析,显示系统、输入系统、振动器系统、音频系统、视频输出系统的驱动,OpenMax多媒体、多媒体插件框架,传感器、照相机...
全书分为19章,依次讲解驱动移植的必要性,何为hal层深入分析,goldfish、msm、map内核和驱动解析,显示系统、输入系统、振动器系统、音频系统、视频输出系统的驱动,openmax多媒体、多媒体插件框架,传感器、照相机...
第4~9章是必备技术篇,详细讲解了Android底层开发的必备技术,分别讲解了分析Android源码、驱动移植、HAL层分析、Goldfish内核驱动分析、MSM内核驱动分析和OMAP内核驱动分析的基本知识;第10~21章是核心技术与应用...
主要介绍了android实现添加耳机状态图标的方法,较为详细的分析了Android实现添加耳机图标的原理与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下
PyEMMA(EMMA =艾玛的马尔可夫模型算法)是一个开放源代码的Python / C软件包,用于分析广泛的分子动力学模拟。 特别是,它包括用于以下方面的估计,验证和分析的算法: 聚类和特征化 马尔可夫状态模型(MSM) 隐...