【问题标题】:Spring (mvc, websockets) sometimes raises an Exception while creating an instanceSpring(mvc,websockets)有时会在创建实例时引发异常
【发布时间】:2020-09-15 12:20:33
【问题描述】:

在我们的生产(tomcat、java8)服务器上,我们有时会在日志文件中看到以下堆栈跟踪:

java.lang.Exception
        at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
        at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
        at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
        at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:142)
        at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:102)
        at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.createAttribute(ModelAttributeMethodProcessor.java:139)
        at org.springframework.web.servlet.mvc.method.annotation.ServletModelAttributeMethodProcessor.createAttribute(ServletModelAttributeMethodProcessor.java:82)
        at org.springframework.web.method.annotation.ModelAttributeMethodProcessor.resolveArgument(ModelAttributeMethodProcessor.java:106)
        at org.springframework.web.method.support.HandlerMethodArgumentResolverComposite.resolveArgument(HandlerMethodArgumentResolverComposite.java:121)
        at org.springframework.web.method.support.InvocableHandlerMethod.getMethodArgumentValues(InvocableHandlerMethod.java:158)
        at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:128)
        at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827)
        at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738)
        at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)
        at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:967)
        at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:901)
        at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970)
        at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:635)
        at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846)
        at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
        at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
        at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
        at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:728)
        at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:591)
        at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:527)
        at org.apache.catalina.core.StandardHostValve.custom(StandardHostValve.java:380)
        at org.apache.catalina.core.StandardHostValve.throwable(StandardHostValve.java:323)
        at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:166)
        at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
        at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:660)
        at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
        at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343)
        at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:798)
        at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
        at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
        at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
        at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
        at java.lang.Thread.run(Thread.java:748)

此异常的原因可能是什么?如何追踪起源?

谢谢

【问题讨论】:

  • 尝试开启bug以获得更多日志。您当前的日志没有帮助!

标签: java spring tomcat exception websocket


【解决方案1】:

基于例如:Spring Boot custom error controller is showing the incorrect exception this 可能是您自己的代码抛出的异常,所以可能在您自己的代码库中搜索抛出异常的地方。

为了使事情复杂一点,这一切都是在本机代码中实现的,请参阅:class newInstance propagates checked and unchecked exceptions - is it true?

但也许它被进一步混淆了,因为您的生产系统上的原始异常已经生成了很多次(自启动以来)并已转换为极其优化的本机代码。

在这种情况下,您可以:

  • 在应用程序刚启动时在日志中看到这一点;或
  • 如果您使用此额外参数启动 Java:-XX:-OmitStackTraceInFastThrow(在您的应用程序 jar/Main 类名和应用程序参数之前)

我希望这会有所帮助,我很好奇是否是这种情况,所以请告诉我(以及所有其他可能稍后来到这里的读者)。

【讨论】:

  • 感谢@JohannesB,我们目前的怀疑是管道损坏或类似异常。值得庆幸的是,异常本身不会导致任何问题,只会污染日志文件。我们将在我们的暂存环境中配置 XX 参数,它会显示相同的异常。如果我们有更多见解,我会在这里发帖。
  • 更新:我添加了一个 exceptionResolver,并且能够在启动 websocket 时记录实际的异常,这些异常是损坏的管道异常。
【解决方案2】:

我现在没有 spring mvc 代码在我面前,但看起来有一个错误的端点。

ModelAttributeMethodProcessor 试图创建一个模型属性(基本上应该是你代码中的东西,并且这个类应该有构造函数)并且无法实例化它。

这样的调用可能会响应 500 http 状态(或至少不是 200)。现在,您可能在某处有一个访问日志(包含所有请求/响应状态的日志)——它可以是网关、应用负载均衡器、ELB,这实际上取决于您运行的位置。 在这种情况下,您可能能够检查这些日志并尝试找到有时返回 5XX 代码的端点。也许会有相同的端点有时不起作用。现在正如你所说,它不应该真的给你的服务器带来问题,但是期望通过调用这个端点来获得结果的客户端显然没有得到想要的响应。

【讨论】:

    猜你喜欢
    • 2014-02-02
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2013-05-28
    • 2014-01-20
    • 1970-01-01
    相关资源
    最近更新 更多