UnsupportedOperationException выбрасывается при попытке удалить SelectionKey из итератора
Код ниже показывает небольшой кусок кода, который пытается принять входящие соединения от клиентов (типичная реализация с java NIO), но когда я пытаюсь удалить SelectionKey из Итератора, он выдает это исключение.
Этот код очень похож на учебник Jenkov и на другой Acceptor (строка 270) SocketServer от Apache Kafka.
override def run(): Unit = {
this.logger.info("Acceptor started.")
super.run()
this.serverSocketChannel.register(this.selector, SelectionKey.OP_ACCEPT)
while (this.isRunning) {
val readyKeys = this.selector.select(500)
if (readyKeys > 0) {
val selectedKeys = this.selector.keys()
val selectionKeysIterator = selectedKeys.iterator()
while (selectionKeysIterator.hasNext && this.isRunning) {
val selectionKey = selectionKeysIterator.next()
selectionKeysIterator.remove()
if (!selectionKey.isAcceptable)
throw new IllegalStateException("The SelectionKey is not on the valid state [Acceptable].")
this.accept(selectionKey)
}
}
}
this.selector.close()
}
1 ответ
Решение
Набор selected-key возвращается selector.selectedKey (у вас есть selector.keys, который указан как неизменяемый)