美文网首页
Druid的WebStatFilter报错问题

Druid的WebStatFilter报错问题

作者: 等你足够强了再说吧 | 来源:发表于2018-10-16 11:40 被阅读0次

    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

    WebAppStat

    问题在这里

    根据判断条件,找到属性 maxStatUriCount

    MaxStatUriCount

    再定位到

    也就是说请求的 uriStatMapFullCount 当中的uri 已经超过了默认值 1000

    所以说为什么会在 1000 左右的时候下载失败,导致服务器崩溃

    如何解决这个问题

    WebStatFilter 里面有一个属性

    首先是一个拦截器,明显可以再 web.xml 中进行配置解决

    Init方法

    第一个就是初始化的时候排除不需要进入拦截器的路径。所以在这里加上需要排除的路径。

    解决办法

    web.xml

    这样就根据源码解决了Druid webStatFilter 的问题。

    相关文章

      网友评论

          本文标题:Druid的WebStatFilter报错问题

          本文链接:https://www.haomeiwen.com/subject/iyaczftx.html