Rih*_*rds 11 java networking nio exception
为什么我CancelledKeyException一天要几次?我该怎么办呢?我的代码错了吗?
Iterator<SelectionKey> keys = selector.selectedKeys().iterator();
while (keys.hasNext()) {
SelectionKey key = (SelectionKey) keys.next();
keys.remove();
try {
if (key.isValid()) {
if (key.isReadable()) {
readHandler.handle((Connection) key.attachment());
}
if (key.isWritable()) {
writeHandler.handle((Connection) key.attachment());
}
if (key.isAcceptable()) {
acceptHandler.handle(key);
}
}
} catch (CancelledKeyException e) {
_logger.error("CanceledKeyException in while loop:", e);
}
}
Run Code Online (Sandbox Code Playgroud)
例外:
java.nio.channels.CancelledKeyException: null
at sun.nio.ch.SelectionKeyImpl.ensureValid(SelectionKeyImpl.java:55) ~[na:1.6.0_12]
at sun.nio.ch.SelectionKeyImpl.readyOps(SelectionKeyImpl.java:69) ~[na:1.6.0_12]
at java.nio.channels.SelectionKey.isWritable(SelectionKey.java:294) ~[na:1.6.0_12]
at project.engine.io.SimpleReactor.work(SimpleReactor.java:194) ~[engine-02.06.11.jar:na]
at project.server.work.AbstractWorker$1.run(AbstractWorker.java:20) [server-21.05.11.jar:na]
at java.lang.Thread.run(Thread.java:619) [na:1.6.0_12]
Run Code Online (Sandbox Code Playgroud)
其中一个处理程序可能会关闭通道.例如,如果读取处理程序读取-1 ,则读取处理程序应关闭该通道.因此写处理程序将失败.确实isWritable()会失败,因为我现在可以从你的堆栈跟踪中看到.所以你必须测试isValid()其他所有条件,例如isValid() && isReadable(), isValid() && isWritable(),等.
| 归档时间: |
|
| 查看次数: |
10535 次 |
| 最近记录: |