定时清理垃圾session
增加java类:
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.catalina.Context;
import org.apache.catalina.Session;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.jstripe.tomcat.probe.beans.ContainerWrapperBean;
import org.jstripe.tomcat.probe.beans.stats.collectors.BaseStatsCollectorBean;
import org.jstripe.tomcat.probe.model.ApplicationSession;
import org.jstripe.tomcat.probe.tools.ApplicationUtils;
@SuppressWarnings("unchecked")
public class ExpireSessionsSchedule extends BaseStatsCollectorBean {
protected final Log logger = LogFactory.getLog(getClass());
private List contextNames = new ArrayList();
public ContainerWrapperBean containerWrapper;
private Map<String,String> conf = new HashMap<String,String>();
public void setContextNames(List contextNames) {
this.contextNames = contextNames;
}
public void setContainerWrapper(ContainerWrapperBean containerWrapper) {
this.containerWrapper = containerWrapper;
}
public ContainerWrapperBean getContainerWrapper() {
return containerWrapper;
}
public void setConf(Map<String, String> conf) {
this.conf = conf;
}
private int idleConf,ageConf,idle,age;
public void collect() throws Exception{
Context context = null;
idleConf = Integer.valueOf(conf.get("idle"));
ageConf = Integer.valueOf(conf.get("age"));
if (contextNames != null) {
for (int i = 0; i < contextNames.size(); i++) {
context = containerWrapper.getTomcatContainer().findContext(contextNames.get(i).toString());
if (context.getManager() != null ) {
Session sessions[] = context.getManager().findSessions();
for (int j = 0; j < sessions.length; j++) {
Session session = sessions[i];
ApplicationSession appSession = ApplicationUtils.getApplicationSession(session, false, false);
if (appSession != null) {
idle = Integer.valueOf((appSession.getIdleTime()/60000)+"");
age = Integer.valueOf((appSession.getAge()/60000)+"");
if(appSession.isSerializable() || idle >= idleConf || age >= ageConf){
logger.info("serializable=="+appSession.isSerializable()+";idle=="+idle+";age=="+age);
if (session != null) {
logger.info("expired session=="+session.getId());
session.expire();
}
}
}
}
}
}
}
}
}
修改配置文件spring-stats.xml
增加配置
<bean name="sessionScheduleCollector"
class="*.*.*.ExpireSessionsSchedule">
<property name="containerWrapper" ref="containerWrapper" />
<property name="contextNames">
<list>
<value>/BIOP</value>
</list>
</property>
<property name="conf">
<map>
<entry key="idle"><value>2</value></entry>
<entry key="age"><value>180</value></entry>
</map>
</property>
</bean>
<bean id="sessionScheduleJobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="sessionScheduleCollector" />
<property name="targetMethod" value="collect" />
<property name="concurrent" value="false" />
</bean>
<bean id="sessionScheduleTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
<property name="jobDetail" ref="sessionScheduleJobDetail" />
<property name="cronExpression">
<value>0 0/2 * * * ?</value>
</property>
</bean>
并在scheduler中加上
<ref local="sessionScheduleTrigger" />
分享到:
相关推荐
NULL 博文链接:https://liu-shui8.iteye.com/blog/561404
4. 源码开放允许用户深入理解工具的工作原理,甚至根据需要进行二次开发。 5. 汉化涉及翻译界面文本、错误消息等内容,需保持与原始功能对应并符合中文语言习惯。 了解这些知识点,开发者或普通用户可以更好地参与...
**探针函数**(Probe Function)在Linux内核驱动开发中扮演着至关重要的角色。它是设备驱动程序中用于完成初始化工作的关键函数之一。探针函数通常在设备驱动注册的最后阶段被调用,它的主要任务是在设备(Device)...
PHPdisk作为网盘系统的名字,可能是一个基于PHP构建的开源项目,提供了基础架构和功能模块,方便开发者进行二次开发和定制。 3. 探针技术: 在软件开发中,探针是用来监控系统运行状态和性能的工具。在网盘系统中,...
资源大于15MB分2次上传。 清晰度一般。加到11章 第12,13章没有。 第1章 嵌入式系统基础. 1.1 嵌入式系统简介 1.1.1 嵌入式系统定义 1.1.2 嵌入式系统与PC 1.1.3 嵌入式系统的特点 1.2 嵌入式系统的发展 1.2.1...
`e2prom`是一种存储类型,它允许在不破坏芯片的情况下多次进行读写操作。与传统的EPROM相比,`e2prom`增加了电擦除功能,无需特殊设备即可完成数据修改。在嵌入式系统和计算机硬件中,`e2prom`常用于存储BIOS、设备...
#### 二、I2C驱动分层架构 Linux内核中的I2C驱动通常采用分层设计思想,主要分为两个层次:**总线层**和**设备层**。 1. **总线层**:该层主要关注的是I2C总线本身的管理,包括初始化、配置、读写操作等。它负责...
CS2395驱动是针对HISI平台的专用驱动程序,主要负责与CS2395芯片进行通信和数据交换。在嵌入式系统和物联网...这个驱动经过验证的可用性意味着它已经在实际环境中稳定运行,用户可以放心使用或作为参考进行二次开发。
理解 FFmpeg 的代码框架和组件间的交互对于开发自定义的音视频处理程序或者进行二次开发是非常重要的。这包括了解如何编写新的编码器、解码器、复用器或解复用器,以及如何将它们集成到 FFmpeg 的生态系统中。同时,...
总的来说,《Linux那些事儿之我是SCSI硬盘》不仅是一本深入浅出的技术书籍,更是对SCSI硬盘驱动开发的一次全面剖析。它揭示了SCSI硬盘在Linux系统中的工作原理,以及驱动程序设计与实现的关键细节,对于希望深入了解...
开发者可以通过阅读源码,深入了解uCGUI的工作机制,也可以在此基础上进行二次开发和定制。 3. **uCProbeSetup.exe**:这可能是uCProbe的安装程序。uCProbe是一款强大的调试工具,它能配合uCGUI进行图形界面的调试...
8. **易用性**:源码应具有清晰的文档和易于理解的结构,方便开发者进行二次开发和定制。 9. **软件/插件**:标签中的“软件/插件”表明这可能是一个可以独立部署的软件,也可以作为其他系统的插件集成。 在实际...
当执行到内核驱动调用时,尤其是调用到serial8250_init串口驱动的注册,会调用platform_driver_register()函数,这是第二次初始化console_register流程的开始。 至于console对uboot参数的处理,是在start_kernel()...
通过阅读和修改源代码,不仅可以了解APTo的工作原理,还可以进行二次开发,增强软件功能或适配特定的研究需求。 总而言之,APTo是一个强大的3D Atom Probe数据分析工具,它的开源特性使得研究者能够自由地使用、...
源代码可以帮助开发者了解其内部工作原理,甚至进行二次开发。配置文件则允许管理员调整CoreDNS的行为,例如添加自定义的DNS记录,或者启用特定的插件功能。 `k8s集群学习.txt` 文件可能是关于如何在Kubernetes集群...
1. **发展历程**:以太网自1970年代由施乐公司发明以来,经过多次技术迭代和发展,已经成为当今局域网的主要技术之一。它最初是为了满足局域网内部设备之间的高速数据交换需求而设计的。 2. **连接方式与拓扑结构**...
#### 二、Linux设备驱动模型 Linux设备驱动模型主要包括三个核心组件:总线、设备和驱动。 1. **总线 (Bus)** - 定义了设备与驱动之间如何交互的标准,如AHB、APB和PCI总线。 - 总线的`match`函数负责匹配驱动与...