Чтение контейнерных журналов с флагом «follow», поток заблокирован навсегда - PullRequest
0 голосов
/ 17 января 2019

Данный бэкэнд, который обрабатывает пользовательские запросы на чтение журналов контейнера (с параметром 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.

Вопрос : Есть ли способ разблокировки темы? Или, может быть, есть другой подход к решению этой проблемы (т. Е. Есть возможность перестать ждать логи)?

...