2012-04-17 1 views
1

Я изучаю метод NioWorker.run() и пытаюсь понять, как это работает. Ниже приведена упрощенная версия кода:Netty architecture - вопросы о петле NioWorker

for(;;) {   
     try { 
     SelectorUtil.select(selector); 

     if (wakenUp.get()) { 
      selector.wakeup(); 
     } 

     cancelledKeys = 0; 
     processRegisterTaskQueue(); 
     processWriteTaskQueue(); 
     processSelectedKeys(selector.selectedKeys()); 

     } catch (Throwable t) { 
     } 
    } 

Более-менее ясно, что она делает, однако у меня есть некоторые вопросы:

1. Selector.select (селектор) выполняет выбор с 500 миллисекундный тайм-аут. Почему это не просто блокирующий вызов?

2. Какова цель нижнего фрагмента? Почему нам нужно выполнять пробуждение?

if (wakenUp.get()) { 
     selector.wakeup(); 
    } 

Заранее спасибо

ответ

2
  1. Мы используем вызов времени на основе блокировки Selector.select (..), потому что мы также занимаемся регистрирующий новых каналов работника через processRegisterTaskQueue() метод , Если мы не будем использовать часовой пояс, мы рискуем замедлиться. Мы даже изменили вызов Selector.select (..), чтобы использовать 10ms в последних версиях.

  2. Смотрите комментарий в [1]

[1] https://github.com/netty/netty/blob/3/src/main/java/org/jboss/netty/channel/socket/nio/AbstractNioWorker.java#L202

+0

1. Согласно моему пониманию блокировки селектора разблокируют в случае приходит новое соединение, так что вы не должны имеют временный вызов для вызова вызываемого процессаRegisterTaskQueue. 2. В комментарии в приложении обсуждается только про wakenUp.get(). Я хочу понять причину, по которой селектор должен вообще проснуться? Есть ли более чем один поток, работающий с селектором? –

+0

Новые соединения принимаются в потоке босса с помощью отдельного селектора для селектора, используемого IO-Worker для обработки соединения. Передача из селектора босса в селектор IO-Worker обрабатывается задачами размещения босса, чтобы зарегистрировать новый канал с IO-Worker в очереди, который затем обрабатывается IO-Worker. IO-Worker нужно разбудить для обработки очереди. – johnstlr