tomcat服务器运行时拦截并中断未处理请求方便服务器随时重启
2017-01-18 09:26
337 查看
前言:
公司内部系统(此处springMVC+hibernate)如果要上线新功能,一般会选择在没人访问服务器的时候,但是有些新功能或者bug的解决都急需上线,而往往当你想上线时,发现还是有很多人在不断的访问系统,如果此时贸然重启tomcat,有可能会导致正在处理的请求出现处理的错误,因此就得有一个能够提醒即将重启服务器,拒绝所有未处理的请求,当在处理过程中的请求都处理完,就可以安全的重启服务器了,以下是自己实现的方法,可能有不足之处,或者有更好的方法,还请留言指教~
思路:
(1)首先我们要有一个能够标志tomcat是否即将重启的标志,以方便判断是否要对所有请求进行拦截.因此会在数据库建一个表,以oracle为例:
建表语句:
(2)接下来,就是需要在每个请求前获取tomcat的是否要重启的状态status,如果为1则,不处理正常继续请求处理,如果为0,则跳转提示页面,终止请求处理.因而,一开始我想到的是拦截器,拦截所有请求,但尝试后发现在拦截器中无法获取到SessionFactory,也就无法操作数据库,无法操作数据库意味着无法获取tomcat重启的标志,具体原因还不清楚,网上参考了很多,但都没能成功~~后来,参考日志记录的方法,采用AOP(面向切面编程),至于AOP的一些配置可以参考网上,以下贴出配置作为参考:
(3)在controller执行前执行@Before,执行完后执行@After,@Around部分,是增强处理,ActionTomcat类中,其中@Before部分和@After部分就不贴出来了,主要在@Around部分,示例代码如下:
(4)每次重启前,只要将数据库status改为0,即可拦截并中断所有之后的请求,待尚未处理的请求处理完,即可重启,重启好后,不要忘了将status重新置为1
如有不足还请多指教~
原创文章,请勿转载,如果转载请注明出处,谢谢!
公司内部系统(此处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
如有不足还请多指教~
原创文章,请勿转载,如果转载请注明出处,谢谢!
相关文章推荐
- JSP get 请求 Tomcat 服务器 插入数据到数据库中文乱码处理
- 重启服务器后Tomcat在Windows端口异常占用的处理(socked bind failed)
- Tomcat服务器处理一个http请求的过程
- ajax请求遇到服务器重启或中断
- intellij使用servlet发送和处理请求, 并用tomcat布置到服务器上
- 服务器tomcat接受请求,中文与空格处理
- Tomcat 服务器对请求中一些特殊的符号需作处理
- 关于spring boot 内嵌tomcat 在window上启动,处理请求卡死---阿里云服务器有瑕疵
- 浏览器拦截跨域请求处理方法(同源策略不允许读取服务器远程资源)
- Tomcat请求处理(一) -- 服务器端口监听
- AD操作时异常:该服务器不愿意处理该请求。 (异常来自 HRESULT:0x80072035)
- 加入域时出现"指定的服务器无法运行请求的操作"解决方法
- Tomcat在处理GET和POST请求时产生的乱码问题
- axis2.AxisFault: 服务器无法处理请求。 ---> 未将对象引用设置到对象的实例。
- Sys.WebForms.PageRequestManagerServerErrorException: 在服务器上处理请求时出现未知错误解决办法
- Sys.WebForms.PageRequestManagerServerErrorException: 在服务器上处理请求时出现未知错误解决办法
- 我对tomcat等服务器的长时间运行后出现死机报内存溢出错误的一点看法
- Tomcat在处理GET和POST请求时产生的乱码问题
- Apache+tomcat+jk处理请求的简单流程
- ASP.NET页面运行机制以及请求处理流程