У меня есть Executors.newCachedThreadPool() в моем контроллере, и моя конечная точка выглядит так:
Код: Выделить всё
@GetMapping("/mySSEStream")
public SseEmitter sseEmitter() {
SseEmitter emitter = new SseEmitter(-1L);
MyRunner streamingRunner = new MyRunner(emitter);
cachedThreadPool.execute(streamingRunner);
return emitter;
}
Код: Выделить всё
public class MyRunner implements Runnable {
private final SseEmitter sseEmitter;
public StreamingRunner(SseEmitter sseEmitter) {
this.sseEmitter = sseEmitter;
}
@Override
public void run() {
try {
sendData();
} catch (IOException ioException) {
sseEmitter.completeWithError(ioException);
} finally {
try {
sseEmitter.complete();
} catch (IllegalStateException illegalStateException) {
log.debug("SSE Emitter already closed...");
}
}
}
Я нигде не могу отловить эту ошибку. Я пробовал использовать AsyncHandlerInterceptor, но безрезультатно. Рекомендуется использовать WebAsyncManager для регистрации отложенного результата, но мне не удалось заставить это работать. Я пробовал @ControllerAdvice и @ExceptionHandler, но этот поток обращается напрямую к контейнеру Tomcat. Я также пробовал фильтр, но он не работает для исходящих сообщений, он фильтрует только входящие от Tomcat.
Я уверен, что здесь что-то упускаю, и буду очень признателен за любую помощь. .
Спасибо.
Подробнее здесь: https://stackoverflow.com/questions/757 ... se-emitter