Несколько ответов от REST-вызова при ожидании одного

В нашем проекте мы реализовали функциональность spring websockets(4.1.7), но с использованием потоковой передачи xhr. Пользовательский интерфейс разработан в Angular-JS. Со времени внедрения веб-сокетов мы наблюдали множество исключений в 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: сломанный канал в org.apache.catalina.connector.OutputBuffer.doFlush(OutputBuffer ~ java) [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] в 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] at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.jc.4-web.7).1 RELEASE.jar:4.1.7.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:101mEL: 4.1.E.j.ar.j.ar.j.j.j.j.j..7.RELEASE] at org.springframework.web.servlet.mvc.method.annotation.RequestResponseBodyMethodProcessor.handleReturnValue(RequestResponseBodyMethodProcessor.java:185) ~[spring-webmvc-4.1.7jRARE. в 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(ServletMhod: 6) ~[spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE] в org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException(ExceptionHandlerExceptionResolmcj): -4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.web.servlet.handler.AbstractHandlerMethodExceptionResolver.doResolveException(AbstractHandlerMethodExceptionResolver.java:60) [spring-webmrELE-4.1.7.jpg.7.RELEASE] at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.resolveException(AbstractHandlerExceptionResolver.java:138) [spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE] в org.sprf.web.servlet.handler.HandlerExceptionResolverComposite.resolveException(HandlerExceptionResolverComposite.java:74) [spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE] at 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.we.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:971) [spring-webmvc-4.1.7.RELEASE.jar:4.1.7.RELEASE] в org.springframework.web.servlet.DispatcherServlet.doService(DispatcherSer3.89)) [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.j:729) [servlet-api.jar:?] в 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] в org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) [catalina.jar:8.0.23] в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java: cat20.java: jal: cat20:8.0.23] at 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) [весна -web-4.1.7.RELEASE.jar:4.1.7.RELEASE] at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261) [spring-web-4.1.7.RELEASE.jar:4.1 С 206) [catalina.jar:8.0.23] на com.xxxxxxx.iop.common.filter.CloudCORSFilter.doFilter(CloudCORSFilter.java:87) [iop-common-0.1.jar:0.1] на org.apache.catalina. core.ApplicationFilterChain.internalDoFilter (ApplicationFilterChain.java:239) [catalina.jar:8.0.23] в org.apache.catalina.core.ApplicationFilterChain.doFilter (ApplicationFilterChain.java:206) [catalina.23] at: 8 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] в орг.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:614) [catalina.jar:8.0.23] в org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) [8]: 8.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:6) [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] в org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668) [tomcat-coyote.jar:8.0.23] в 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] в 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: сломанный канал в java.net.SocketOutputStream.socketWrite0(собственный метод) ~[?: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] в sun.security.ssl.OutputRecord.writeBuffer(OutputRecord. Java:431) ~[?:1.8.0_45] at 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] at 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] at org.apache.coyote.http11.InternalOutputBuffer.flushBuffer(InternalOutputBuff19)) ~ [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] at 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] в или g.apache.catalina.connector.OutputBuffer.flush (OutputBuffer.java:317) ~ [catalina.jar:8.0.23] в org.apache.catalina.connector.Response.flushBuffer(Response.java:510) ~[каталина.jar:8.0.23] at org.apache.catalina.connector.ResponseFacade.flushBuffer(ResponseFacade.java:318) ~[catalina.jar:8.0.23] в javax.servlet.ServletResponseWrapper.flushBuffer(ServletResponseWrara) ~[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.soocks.Sion.portSj.writeFrame(AbstractSockJsSession.java:325) ~[?:?] at org.springframework.web.socket.sockjs.transport.session.AbstractSockJsSession.sendHeartbeat(AbstractSockJsSession.java:249) ~[?:?] на работе.web.socket.sockjs.transport.session.AbstractSockJsSession$1.run(AbstractSockJsSession.java:269) ~[?:?] в org.springframework.scheduling.support.DelegatingErrorHandlingRunnable.run(DelegatingErrorHandlingRunnj) 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. Выполнить (FutureTask.java:266) ~[?:1.8.0_45] в java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180) ~[?:1.8.0_45] в java.util.concur.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) ~[?:1.8.0_45] в java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) ~ 45: at 1.8.0.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) ~[?:1.8.0_45] ... еще 1


Реальная проблема здесь в том, что, так как это исключение не поймано, оно отправляется в catalina.out. Это все еще хорошо, так как больше шума, чем все остальное. но теперь мы поняли, что некоторые тесты периодически терпят неудачу из-за этой проблемы.

Служба, реализующая веб-сокет, работает в том же коте, что и другие службы. Когда проверка подлинности вызова к службе безопасности успешна, у объекта ответа есть два ответа один от аутентификации и другой от этого исключения.

Я до сих пор не понимаю, почему ответ об ошибке из исключения добавляется к успешному вызову аутентификации? Почему его добавление к любому случайному запросу?

В документации Spring найдено следующее утверждение, означающее, что сервлет может записать ответ в любой другой поток. Но я хотел бы избежать этого и каким-то образом перехватить исключение и записать его в журнал http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/

25.3.5. Асинхронные запросы сервлета 3 Для потоковой передачи HTTP и длинного опроса HTTP Для транспорта SockJS требуется, чтобы соединение оставалось открытым дольше, чем обычно. Для обзора этих методов см. Этот пост в блоге.

В контейнерах Servlet это выполняется с помощью асинхронной поддержки Servlet 3, которая позволяет выйти из потока контейнера Servlet, обрабатывающего запрос, и продолжить запись в ответ из другого потока.

Любая помощь будет оценена.

0 ответов

Другие вопросы по тегам