Tomcat报错如下:
一月 19, 2017 11:21:13 上午 org.apache.catalina.core.StandardWrapperValve invokeSEVERE: Servlet.service() for servlet [default] in context with path [] threw exceptionjava.lang.NullPointerExceptionat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:196)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:503)at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:421)at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:611)at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2466)at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2455)at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)at java.lang.Thread.run(Thread.java:724)
首先一眼看过去便发现
java.lang.NullPointerExceptionat com.alibaba.druid.support.http.WebStatFilter.doFilter(WebStatFilter.java:196)
于是断点打到这一行
这里有个对象:uriStat 即为 WebURIStat
但是始终想不明白为什么这个对象为什么会是null
因为当我们的app 请求下载文件的时候会出现错误,服务器崩溃,导致大部分功能不能使用的情况。
之后拿到app 本地测试下载的时候发现,刚好请求下载到 1000 多个的时候就开始出现以上错误,从而导致服务器崩溃,一开始以为是Tomcat 的并发问题。
但是在本地下载,跟踪到源码,在下载到接近 1000 个的时候断点卡住,不让其下载。继续断点发现了控制台输出聊聊几句:
uriSessionMapFullCount is full
于是赶紧根据 uriSessionMapFullCount 到源码中查找:
进入对象 WebAppStat
问题在这里
根据判断条件,找到属性 maxStatUriCount
再定位到
也就是说请求的 uriStatMapFullCount 当中的uri 已经超过了默认值 1000
所以说为什么会在 1000 左右的时候下载失败,导致服务器崩溃
首先是一个拦截器,明显可以再 web.xml 中进行配置解决
第一个就是初始化的时候排除不需要进入拦截器的路径。所以在这里加上需要排除的路径。
web.xml
这样就根据源码解决了Druid webStatFilter 的问题。
网友评论