期待一个

时间:2016-05-17 20:05:54

标签: websocket tomcat8 spring-websocket sockjs java-websocket

在我们的项目中,我们已经实现了spring websockets(4.1.7)功能,但使用了xhr流。 UI是在angular-JS中开发的。从我们实现websockets开始,我们在catalina.out中观察到很多异常。

我们正在使用sockJS协议来实现使用spring websocket实现的流式传输。

  

2016-04-19 22:14:53,426 [http-bio-8443-exec-17] 错误 - 无法调用@ExceptionHandler方法:public com.xxxxxxx.iop.common.exception.ErrorResponse com。 xxxxxxx.iop.common.exception.ExceptionMapper.handleOtherExceptions(java.lang.Exception的)   org.apache.catalina.connector.ClientAbortException:java.net.SocketException:Broken pipe       在org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:353)〜[catalina.jar:8.0.23]       在org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:317)〜[catalina.jar:8.0.23]       在org.apache.catalina.connector.CoyoteOutputStream.flush(CoyoteOutputStream.java:110)~ [catalina.jar:8.0.23]       在com.fasterxml.jackson.core.json.UTF8JsonGenerator.flush(UTF8JsonGenerator.java:1042)〜[jackson-core-2.5.1.jar:2.5.1]       at com.fasterxml.jackson.databind.ObjectMapper.writeValue(ObjectMapper.java:2242)~ [jackson-databind-2.5.1.jar:2.5.1]       在org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:231)〜[spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE]       在org.springframework.http.converter.AbstractHttpMessageConverter.write(AbstractHttpMessageConverter.java:208)〜[spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE]       在org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:161)〜[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]       在org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:101)〜[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]       在org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:185)〜[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]       在org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue(HandlerMethodReturnValueHandlerComposite.java:71)〜[spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE]       在org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:126)〜[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]       at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolver.java:362)[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]       at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:60)[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]       at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:138)[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]       at org.springframework.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:74)[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]       在org.springframework.web.servlet.DispatcherServlet.processHandlerException(DispatcherServlet.java:1183)[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]       在org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1020)[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]       在org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:971)[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]       在org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]       在org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967)[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]       在org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869)[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]       在javax.servlet.http.HttpServlet.service(HttpServlet.java:648)[servlet-api.jar:?]       在org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE]       在javax.servlet.http.HttpServlet.service(HttpServlet.java:729)[servlet-api.jar:?]       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)[catalina.jar:8.0.23]       在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)[catalina.jar:8.0.23]       at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)[tomcat-websocket.jar:8.0.23]       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)[catalina.jar:8.0.23]       在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)[catalina.jar:8.0.23]       在org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:186)[spring-security-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]       在org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)[spring-security-web-3.2.5.RELEASE.jar:3.2.5.RELEASE]       在org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)[spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE]       在org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)[spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE]       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)[catalina.jar:8.0.23]       在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)[catalina.jar:8.0.23]       在com.xxxxxxx.iop.common.filter.CloudCORSFilter.doFilter(CloudCORSFilter.java:87)[iop-common-0.1.jar:0.1]       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)[catalina.jar:8.0.23]       在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)[catalina.jar:8.0.23]       at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)[catalina.jar:8.0.23]       at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)[catalina.jar:8.0.23]       在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614)[catalina.jar:8.0.23]       在org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)[catalina.jar:8.0.23]       at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)[catalina.jar:8.0.23]       at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:617)[catalina.jar:8.0.23]       在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)[catalina.jar:8.0.23]       在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)[catalina.jar:8.0.23]       在org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)[tomcat-coyote.jar:8.0.23]       at org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:668)[tomcat-coyote.jar:8.0.23]       at org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:277)[tomcat-coyote.jar:8.0.23]       在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)[?:1.8.0_45]       在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)[?:1.8.0_45]       at org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)[tomcat-util.jar:8.0.23]       在java.lang.Thread.run(Thread.java:745)[?:1.8.0_45]   引起:java.net.SocketException:管道损坏       at java.net.SocketOutputStream.socketWrite0(Native Method)〜[?:1.8.0_45]       在java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:109)〜[?:1.8.0_45]       在java.net.SocketOutputStream.write(SocketOutputStream.java:153)〜[?:1.8.0_45]       at sun.security.ssl.OutputRecord.writeBuffer(OutputRecord.java:431)〜[?:1.8.0_45]       在sun.security.ssl.OutputRecord.write(OutputRecord.java:417)〜[?:1.8.0_45]       at sun.security.ssl.SSLSocketImpl.writeRecordInternal(SSLSocketImpl.java:864)〜[?:1.8.0_45]       在sun.security.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:835)〜[?:1.8.0_45]       在sun.security.ssl.AppOutputStream.write(AppOutputStream.java:123)〜[?:1.8.0_45]       在org.apache.coyote.http11.InternalOutputBuffer.realWriteBytes(InternalOutputBuffer.java:170)~ [tomcat-coyote.jar:8.0.23]       在org.apache.tomcat.util.buf.ByteChunk.flushBuffer(ByteChunk.java:426)〜[tomcat-util.jar:8.0.23]       在org.apache.coyote.http11.InternalOutputBuffer.flushBuffer(InternalOutputBuffer.java:198)~ [tomcat-coyote.jar:8.0.23]       在org.apache.coyote.http11.AbstractOutputBuffer.flush(AbstractOutputBuffer.java:305)〜[tomcat-coyote.jar:8.0.23]       在org.apache.coyote.http11.AbstractHttp11Processor.action(AbstractHttp11Processor.java:765)〜[tomcat-coyote.jar:8.0.23]       在org.apache.coyote.Response.action(Response.java:179)〜[tomcat-coyote.jar:8.0.23]       在org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer.java:349)〜[catalina.jar:8.0.23]       在org.apache.catalina.connector.OutputBuffer.flush(OutputBuffer.java:317)〜[catalina.jar:8.0.23]       在org.apache.catalina.connector.Response.flushBuffer(Response.java:510)〜[catalina.jar:8.0.23]       在org.apache.catalina.connector.ResponseFacade.flushBuffer(ResponseFacade.java:318)〜[catalina.jar:8.0.23]       在javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrapper.java:176)〜[servlet-api.jar:3.1.FR]       在org.springframework.http.server.ServletServerHttpResponse.flush(ServletServerHttpResponse.java:90)〜[spring-web-4.1.7.RELEASE.jar:4.1.7.RELEASE]       在org.springframework.web.socket.sockjs.transport.session.AbstractHttpSockJsSession.writeFrameInternal(AbstractHttpSockJsSession.java:345)〜[?:?]       在org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.writeFrame(AbstractSockJsSession.java:325)〜[?:?]       在org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.sendHeartbeat(AbstractSockJsSession.java:249)〜[?:?]       在org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession $ 1.run(AbstractSockJsSession.java:269)〜[?:?]       在org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnable.java:54)〜[spring-context-4.1.7.RELEASE.jar:4.1.7.RELEASE]       在java.util.concurrent.Executors $ RunnableAdapter.call(Executors.java:511)〜[?:1.8.0_45]       在java.util.concurrent.FutureTask.run(FutureTask.java:266)〜[?:1.8.0_45]       at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.access $ 201(ScheduledThreadPoolExecutor.java:180)~ [?:1.8.0_45]       at java.util.concurrent.ScheduledThreadPoolExecutor $ ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)〜[?:1.8.0_45]       在java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)〜[?:1.8.0_45]       在java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)〜[?:1.8.0_45]       ......还有1个

这里真正的问题是因为这个例外没有被捕获它转到catalina.out。这仍然很好,因为它比其他任何东西更多的噪音。但现在我们意识到由于这个问题,一些测试会间歇性地失败。

实现websocket的服务与其他服务在同一个tomcat中运行。当对安全服务的身份验证调用成功时,响应对象有两个响应,一个来自身份验证,另一个来自此异常。

我仍然不明白为什么异常的错误响应被附加到成功的身份验证调用?为什么要附加任何随机请求?

在Spring文档中找到以下语句,这意味着servlet可以将响应写入任何其他线程。但我想避免这种情况,并以某种方式捕获异常并记录它 http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#websocket-fallback

  

25.3.5 Servlet 3异步请求HTTP流和HTTP长轮询SockJS传输要求连接保持打开时间长于   通常。有关这些技术的概述,请参阅此博客文章。

     

在Servlet容器中,这是通过Servlet 3异步支持完成的   允许退出Servlet容器线程处理请求   并继续写另一个帖子的回复。

任何帮助都将不胜感激。

0 个答案:

没有答案