我有一个应用程序,客户端接收 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();
}
}
}
鸿蒙传说
相关分类