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 + " ==================" );
}
}
}
分享到:
相关推荐
为了便于开发者阅读和理解这些源代码,高通推荐使用Source Insight等代码分析工具。通过这些工具,我们可以方便地浏览、搜索和理解LK代码的结构和功能,这对于调试、优化和定制Bootloader有着极大的帮助。 总的来说...
第一章 走进linux 1.1 GNU与Linux的成长 ...1.7 Linux内核源代码分析工具 1.7.1 Linux超文本交叉代码检索工具 1.7.2 Windows平台下的源代码阅读工具Source Insight 第二章 Linux运行的硬件基
这个文件很可能是MSM6295发声的CPU汇编程序源代码。通过阅读和理解这个文件,我们可以了解到如何设置和控制MSM6295,包括初始化过程、数据传输的细节、中断处理机制以及音效控制的汇编指令。 4. 实际应用: 在...
1. **msm6585.c**:这是一个C语言源代码文件,很可能包含了针对MSM6585芯片的驱动程序或者示例代码,用于演示如何与芯片进行交互和控制。 2. **head.h**:这是一个头文件,通常包含函数声明、常量定义和其他预编译...
该压缩包文件“android_kernel_xiaomi_msm8996-ten-3.18.x小米5备份20200403.zip”主要涉及的是小米5智能手机的Android内核源代码及其相关的定制开发内容。从标签“杂质”来看,这可能是指非官方或者非标准的修改...
5. **adg.c解析**:这个源代码文件可能包含了GPIO控制器的初始化、配置、读写操作以及中断处理等功能实现。 6. **gpio-msm.txt详解**:该文本文件可能包含GPIO控制器的使用示例、API参考、故障排查指南以及特定平台...
3. **msm7627a GPS驱动**:这个部分涉及到与MSM7627A芯片硬件直接交互的代码。驱动程序会处理与GPS芯片的通信,包括初始化、配置、接收卫星信号、解码定位信息等。这部分源码通常包含在内核模块或者作为单独的库文件...
通过分析"msm_fb.c"源代码,我们可以深入了解MSM帧缓冲驱动的具体实现细节,如如何初始化硬件、如何处理内存分配、如何同步显示操作,以及如何与其他内核组件(如GPU驱动)协作。对于想要深入理解移动设备显示系统...
本文将深入探讨"video-msm_fb.rar_msm_parts"这一主题,主要基于"video-msm_fb.c"源代码文件,解析内部共享定义的各种MSM帧缓冲区部件。 首先,我们要理解帧缓冲区在操作系统中的作用。帧缓冲区是一个内存区域,...
4. **源码分析**: MSM的实现主要位于`org.apache.catalina.ha.session.DeltaManager`类中。深入源码可以帮助理解其内部的同步机制,如`replicateSession()`方法处理Session的复制,`checkSessions()`方法进行定期...
压缩包内的文件“msm_serial_hs.c”和“msm_serial_hs.h”是C语言源代码文件和头文件。"msm_serial_hs.c"很可能包含了驱动程序的主要实现,包括初始化、数据发送和接收等函数。而"msm_serial_hs.h"则可能包含了驱动...
标题中的"phy-msm-usb.rar_MSM HSusb_V2"揭示了这是一个关于高通(Qualcomm...对于开发者来说,分析这个源代码可以帮助他们更好地理解和定制高通MSM设备在Linux上的USB功能,从而实现更高效的数据交换或优化能源使用。
- 文件解析:这个源码文件可能包含初始化UART硬件、配置波特率、设置中断处理函数、读写操作的实现等关键函数。 - 高速接收:为了达到高速接收,驱动可能使用DMA(直接内存访问)技术,一次性传输大量数据到内存,...
3. **ehci-msm.c源码分析** `ehci-msm.c`文件是针对Qualcomm MSM平台的`ehci`驱动的具体实现。源码通常包括初始化、设备枚举、中断处理、传输调度等功能的实现。在这个文件中,开发者会找到针对MSM平台特性定制的...
标题“msm-poweroff.rar_V2”提及的是一个与Linux内核相关的更新,特别是针对MSM(Mobile Station ...通过解析和理解“msm-poweroff.c”源代码,我们可以深入了解Linux内核电源管理的底层机制以及MSM平台的特异性。
这个培训教程旨在深入解析MSM7500芯片的硬件结构、功能特性和应用开发,帮助工程师们更好地理解和利用该芯片进行产品设计。 ### 一、MSM7500概述 MSM7500芯片是高通骁龙系列的一员,采用先进的CMOS工艺制造,旨在...
资源名:基于马尔科夫转换多重分形预测模型_MSM模型_捕捉金融时间序列波动中隐藏的离群值、时间标度以及长程相关性特征_matlab 资源类型:matlab项目全套源码 源码说明: 全部项目源码都是经过测试校正后百分百成功...
《瑞士数字逻辑MSM586SEN-SEV-SL技术手册》是为电子工程师和技术人员提供关于瑞士数字逻辑公司生产的微控制器芯片MSM586SEN-SEV-SL的详细技术信息的重要参考资料。这份手册,以英文形式呈现,包含了这款芯片的全面...
标题中的"msm_smd.rar_V2"暗示我们正在处理一个与Linux内核相关的更新...通过分析"msm_smd.c"的源代码,我们可以深入了解这个问题的具体细节以及如何解决它,这对于我们理解和改进Linux内核的驱动程序有着重要的价值。