Данный бэкэнд, который обрабатывает пользовательские запросы на чтение журналов контейнера (с параметром follow ). Используется следующий подход:
Future<?> f = threadPool.submit(() -> {
try {
while (logStream.hasNext()) {
LogMessage msg = logStream.next();
String text = StandardCharsets.UTF_8.decode(msg.content()).toString();
emitter.send(SseEmitter.event().data(text).name(msg.stream().name()));
}
emitter.complete();
} catch (Exception ex) {
emitter.completeWithError(ex);
}
});
, где threadPool
- это просто Executors.newCachedThreadPool()
, а emitter
- это SseEmitter
.
Spring.
Проблема в том, что когда пользователь больше не хочет читать журналы, он просто закрывает соединение, но этот поток все еще работает (выполнение заблокировано в logStream.hasNext()
, который вызывает InputStream.read(..)
).
Насколько я понимаю, hasNext()
никогда не вернет false
(по крайней мере, при правильной работе контейнера), поэтому этот цикл бесконечен, и нам нужно как-то его остановить. Возможное решение, которое я пробовал:
emitter.onCompletion(() -> {
f.cancel(true);
});
не удалось. Не было сгенерировано исключение InterruptedException.
Вопрос : Есть ли способ разблокировки темы? Или, может быть, есть другой подход к решению этой проблемы (т. Е. Есть возможность перестать ждать логи)?