java.nio.channels.AsynchronousClose Java 8 异常

java.nio.channels.AsynchronousClose Exception on Java 8

我刚刚将我的代码从 java 7 windows 移动到 java 1.8 Linux 并且我在相同的代码库

上获得了这个堆栈跟踪

java.nio.channels.AsynchronousCloseException at sun.nio.ch.SimpleAsynchronousFileChannelImpl.run(SimpleAsynchronousFileChannelImpl.java:380) [rt.jar:1.8.0_92] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) [rt.jar:1.8.0_92] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) [rt.jar:1.8.0_92] at java.lang.Thread.run(Thread.java:745) [rt.jar:1.8.0_92]

我的代码如下

  Charset cs = Charset.forName("UTF-8");
        byte[] inputBytes = jsonString.getBytes(cs);
        fileChannel.write(ByteBuffer.wrap(inputBytes), 0, ByteBuffer.wrap(inputBytes),new CompletionHandler<Integer, ByteBuffer>() {

            @Override
            public void completed(Integer result, ByteBuffer attachment) {
                log.info("Async Saving site content completed for sitename");
            }

            @Override
            public void failed(Throwable exc, ByteBuffer attachment) {
                exc.printStackTrace();
                log.error("Async File Write Failed",exc);
                log.fatal(exc);
            }
        });

想知道发生了什么。感谢任何帮助。

根据评论,我再看了一下,上面的代码包含在一个 try catch 中,带有一个 finally 语句,该语句具有 FileStream "close" 方法调用。罪魁祸首是 finally 语句在另一个线程写入通道时关闭了通道。

我删除了 finally 块并将关闭文件流代码移动到完成处理程序中,它现在可以工作了。

注意:它在 windows 中是如何工作的我仍然不明白。代码仍然部署在 Windows 服务器中,就在我写这篇文章之前,我重新测试了它,它与那里的 finally 块一起工作:)。反正不会再花时间在这上面了。

标记为已解决。非常感谢大家的指点。