Как отслеживать асинхронные потоки и обрабатывать ошибки сломанного канала с помощью эмиттера SSE?JAVA

Программисты JAVA общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Как отслеживать асинхронные потоки и обрабатывать ошибки сломанного канала с помощью эмиттера SSE?

Сообщение Anonymous »

Я хочу перехватить исключения IOException, вызванные разрывом канала, прежде чем асинхронные потоки отправят результат в Tomcat. По сути, клиент отключается, и ошибка передается Tomcat, прежде чем я успеваю обнаружить проблему. У меня нет контроля над клиентом(ами).
У меня есть Executors.newCachedThreadPool() в моем контроллере, и моя конечная точка выглядит так:

Код: Выделить всё

    @GetMapping("/mySSEStream")
public SseEmitter sseEmitter() {
SseEmitter emitter = new SseEmitter(-1L);
MyRunner streamingRunner = new MyRunner(emitter);
cachedThreadPool.execute(streamingRunner);
return emitter;
}
MyRunner:

Код: Выделить всё

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...");
}
}
}
Итак, поток контроллера создает эмиттер SSE, второй поток (с именем http-nio-9998-exec-1) принимает запрос, возвращает 200 и начинает отправлять данные. Затем я получаю журнал отладки, в котором говорится, что сервлет диспетчера «Выходит, но ответ остается открытым для дальнейшей обработки». Отключение клиента происходит. Затем третий поток (с именем http-nio-9998-exec-2) начинает обработку ошибки сломанного канала. Я получаю сообщение WebAsyncManager — асинхронная ошибка, отправка в /mySSEStream. Однако, как бы я ни пытался отловить ошибку, она доходит до Tomcat и отвечает ошибкой 500. Я вижу это в отладчике. Очевидно, что 500 не доходит до клиента, но наши метрики конечной точки завалены 500 ошибками.
Я нигде не могу отловить эту ошибку. Я пробовал использовать AsyncHandlerInterceptor, но безрезультатно. Рекомендуется использовать WebAsyncManager для регистрации отложенного результата, но мне не удалось заставить это работать. Я пробовал @ControllerAdvice и @ExceptionHandler, но этот поток обращается напрямую к контейнеру Tomcat. Я также пробовал фильтр, но он не работает для исходящих сообщений, он фильтрует только входящие от Tomcat.
Я уверен, что здесь что-то упускаю, и буду очень признателен за любую помощь. .
Спасибо.

Подробнее здесь: https://stackoverflow.com/questions/757 ... se-emitter
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «JAVA»