您的位置:首页 > 运维架构 > Tomcat

tomcat服务器运行时拦截并中断未处理请求方便服务器随时重启

2017-01-18 09:26 337 查看
前言:

公司内部系统(此处springMVC+hibernate)如果要上线新功能,一般会选择在没人访问服务器的时候,但是有些新功能或者bug的解决都急需上线,而往往当你想上线时,发现还是有很多人在不断的访问系统,如果此时贸然重启tomcat,有可能会导致正在处理的请求出现处理的错误,因此就得有一个能够提醒即将重启服务器,拒绝所有未处理的请求,当在处理过程中的请求都处理完,就可以安全的重启服务器了,以下是自己实现的方法,可能有不足之处,或者有更好的方法,还请留言指教~

思路:

(1)首先我们要有一个能够标志tomcat是否即将重启的标志,以方便判断是否要对所有请求进行拦截.因此会在数据库建一个表,以oracle为例:

建表语句:

CREATE TABLE T_TOMCAT_FILTER(
STATUS NUMBER(1),--1:正常,0:即将重启
MSG    VARCHAR2(1000)--重启前拦截提示信息
);


(2)接下来,就是需要在每个请求前获取tomcat的是否要重启的状态status,如果为1则,不处理正常继续请求处理,如果为0,则跳转提示页面,终止请求处理.因而,一开始我想到的是拦截器,拦截所有请求,但尝试后发现在拦截器中无法获取到SessionFactory,也就无法操作数据库,无法操作数据库意味着无法获取tomcat重启的标志,具体原因还不清楚,网上参考了很多,但都没能成功~~后来,参考日志记录的方法,采用AOP(面向切面编程),至于AOP的一些配置可以参考网上,以下贴出配置作为参考:

<aop:aspectj-autoproxy proxy-target-class="true" />
<bean class="test.web.tomcat.ActionTomcat" />


(3)在controller执行前执行@Before,执行完后执行@After,@Around部分,是增强处理,ActionTomcat类中,其中@Before部分和@After部分就不贴出来了,主要在@Around部分,示例代码如下:

@Around ("execution(* osj.web.controller..*.*(..))")
public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
Object retVal = null;
//tomcat服务器即将重启判断
Object[] obj = logService.getTomcatStatus();
int status = ((BigDecimal)obj[0]).intValue();
String msg = obj[1].toString();
if(status == 0){
System.out.println(msg);
retVal = new ModelAndView("/MSG/index");
((ModelAndView)retVal).addObject("msg",msg);//跳转到提示页面
}else{
retVal = pjp.proceed();  //继续处理请求
}

return retVal;
}


(4)每次重启前,只要将数据库status改为0,即可拦截并中断所有之后的请求,待尚未处理的请求处理完,即可重启,重启好后,不要忘了将status重新置为1

如有不足还请多指教~

原创文章,请勿转载,如果转载请注明出处,谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐