我有一个应用程序,客户端接收 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 requestjava.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(); } } }
1 回答

鸿蒙传说
TA贡献1865条经验 获得超7个赞
经过进一步研究,这个异常可以归咎于tomcat中的一个错误。
https://github.com/spring-projects/spring-boot/issues/15057
为了解决这个问题,我从 tomcat 切换到了 jetty。
添加回答
举报
0/150
提交
取消