2012-04-17 1 views
1

NioWorker.run() 메서드를 조사하고 어떻게 작동하는지 이해하려고합니다. 그것은 내가 몇 가지 질문이 그러나 무엇Netty 아키텍처 - 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)와 선택을 수행 밀리 초 시간 초과. 차단 호출이 아닌 이유는 무엇입니까?

아래의 조각의 목적은 무엇입니까? 왜 우리는 웨이크 업을 수행해야합니까? 우리는 또한 processRegisterTaskQueue를 통해 직원에게 새로운 채널의 등록을 처리하기 때문에 사전에

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

덕분에

답변

2
  1. 우리는 시간 기반 Selector.select 차단 (..) 호출을 사용하여() 메소드 . 시간 기반 호출을 사용하지 않으면 일을 늦출 위험이 있습니다. 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 processRegisterTaskQueue를 호출 할 시간 기반 호출이 있어야합니다. 2. 첨부 파일의 주석은 wakenUp.get()에 대해서만 설명합니다. 선택기가 전혀 깨어나지 않아도되는 이유를 이해하고 싶습니다. 선택기와 함께 작동하는 스레드가 두 개 이상 있습니까? –

+0

연결을 처리하기 위해 IO-Worker에서 사용하는 선택기에 별도의 선택기를 사용하여 보스 스레드에서 새 연결을 사용할 수 있습니다. 보스 셀렉터에서 IO-Worker 셀렉터로의 핸드 오버는 보스 스레드가 큐에 IO-Worker와 새로운 채널을 등록하기 위해 작업을 배치하여 처리하고 IO-Worker에 의해 처리됩니다. IO-Worker는 대기열을 처리하기 위해 깨어나야합니다. – johnstlr