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

前言:

公司内部系统(此处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

如有不足还请多指教~

原创文章,请勿转载,如果转载请注明出处,谢谢!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值