猿问

Sever Sent Event IOException 导致无法捕获的

我有一个应用程序,客户端接收 SseEmitter,SseEmitter 会将 jms 消息中继到客户端。


客户端关闭连接(关闭浏览器)时出现问题。将引发 IOException 导致以下无法捕获的异常:


2019-01-24 12:33:59.163 ERROR 26516 --- [nio-8080-exec-6] o.a.catalina.connector.CoyoteAdapter     : Exception while processing an asynchronous request


java.lang.IllegalStateException: Calling [asyncError()] is not valid for a request with Async state [MUST_DISPATCH]

    at org.apache.coyote.AsyncStateMachine.asyncError(AsyncStateMachine.java:440) ~[tomcat-embed-core-9.0.14.jar:9.0.14]

    at org.apache.coyote.AbstractProcessor.action(AbstractProcessor.java:512) [tomcat-embed-core-9.0.14.jar:9.0.14]

    at org.apache.coyote.Request.action(Request.java:430) ~[tomcat-embed-core-9.0.14.jar:9.0.14]

    at org.apache.catalina.core.AsyncContextImpl.setErrorState(AsyncContextImpl.java:382) ~[tomcat-embed-core-9.0.14.jar:9.0.14]


捕获 IOException 不会阻止抛出此异常。我已经实现了一项工作,客户端发送请求以从将发送事件的发射器集合中删除他的发射器。


但是,在客户端/浏览器崩溃的情况下,仍然会抛出此异常。


   @Scheduled(fixedDelay = 2000L)

      public void sendEvent()  {

           TextMessage message = null;

           try {

               message = messageBlockingQueue.take();

           } catch (InterruptedException e) {

               e.printStackTrace();

           }

           for(SseEmitter sseEmitter:emitterMap.values()) {

               TextMessage finalMessage = message;

                   try {

                       sseEmitter.send(finalMessage.getText());

                   }  catch (IOException e) {

                       sseEmitter.completeWithError(e);

                   } catch (JMSException e) {

                       e.printStackTrace();

                   }

            }

        }


至尊宝的传说
浏览 320回答 1
1回答

鸿蒙传说

经过进一步研究,这个异常可以归咎于tomcat中的一个错误。https://github.com/spring-projects/spring-boot/issues/15057为了解决这个问题,我从 tomcat 切换到了 jetty。
随时随地看视频慕课网APP

相关分类

Java
我要回答