前言:
公司内部系统(此处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
如有不足还请多指教~原创文章,请勿转载,如果转载请注明出处,谢谢!