给定后端,处理用户读取容器日志的请求(带有跟随选项)。使用以下方法:
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 threadPool
is just a Executors.newCachedThreadPool()
and emitter
is Spring's SseEmitter
。
问题是:当用户不再想阅读日志时,他只是关闭了连接,但该线程仍在运行(logStream.hasNext()
正在调用的执行被阻塞InputStream.read(..)
)。
据我了解,hasNext()
永远不会返回false
(至少在容器正常运行时),所以这个循环是无止境的,我们需要以某种方式停止它。我尝试过的可能解决方案:
emitter.onCompletion(() -> {
f.cancel(true);
});
没有成功。没有抛出 InterruptedException。
问题:有什么方法可以解除线程阻塞?或者也许有另一种解决这个问题的方法(即有可能停止等待日志)?