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 块一起工作:)。反正不会再花时间在这上面了。
标记为已解决。非常感谢大家的指点。
我刚刚将我的代码从 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 块一起工作:)。反正不会再花时间在这上面了。
标记为已解决。非常感谢大家的指点。