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, который указан как неизменяемый)

Другие вопросы по тегам