0

给定后端,处理用户读取容器日志的请求(带有跟随选项)。使用以下方法:

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);
  }
});

Where threadPoolis just a Executors.newCachedThreadPool()and emitteris Spring's SseEmitter

问题是:当用户不再想阅读日志时,他只是关闭了连接,但该线程仍在运行(logStream.hasNext()正在调用的执行被阻塞InputStream.read(..))。

据我了解,hasNext()永远不会返回false(至少在容器正常运行时),所以这个循环是无止境的,我们需要以某种方式停止它。我尝试过的可能解决方案:

emitter.onCompletion(() -> {
  f.cancel(true);
});

没有成功。没有抛出 InterruptedException。

问题:有什么方法可以解除线程阻塞?或者也许有另一种解决这个问题的方法(即有可能停止等待日志)?

4

0 回答 0