java - 在没有显式取消 key 的情况下获取 java.nio.channels.CancelledKeyException

标签 java nio socketchannel

我一直在从以下位置抛出java.nio.channels.CancelledKeyException:

at sun.nio.ch.SelectionKeyImpl.ensureValid(SelectionKeyImpl.java:55)
at sun.nio.ch.SelectionKeyImpl.interestOps(SelectionKeyImpl.java:64)

但是,我不会在任何时候显式调用 java.nio.channels.SelectionKey.cancel()

一条重要信息是,这种情况发生在我在 EC2 上运行的测试环境中,并且多台计算机之间正在进行通信,我突然终止了作为通信目标的计算机中的进程。但是,我无法将此异常出现时间与任何启动的进程终止关联起来。如果底层套接字断开连接或存在网络连接问题,是否会发生这种情况?

谢谢

最佳答案

当基础 channel 关闭时, key 会自动取消。您应该在迭代 selectedKeys 时检查有效 key ,并且如果您的事件处理程序可以关闭 channel (至少在读取处理程序的情况下应该如此),您应该在调用 interestOps()、 isWritable()、 等之前检查 key 有效性。

关于java - 在没有显式取消 key 的情况下获取 java.nio.channels.CancelledKeyException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12912388/

相关文章:

java - 在 zip 中写入(修改或添加)文件

JavamappedByteBuffer和flip()和position()

java - 将阻塞 Socket 对象转换为 SocketChannel 的套接字?

java - SelectionKey iterator.remove() 抛出 UnsupportedOperationException 和无限循环

Java 1.5 gc 调整

java - 失败的 "retrying"逻辑的设计模式?

java - sun.rmi.transport.tcp.TCPTransport 使用 100% CPU

java - 如何修复 NoClassDefFoundError : CircularOutputStream error?

java - 使用 Unity3D 和 Vuforia 的 Android 4.1.2 上相机为黑色

java - 对 Java SocketChannel 的非阻塞写入