2016-07-16 1 views
0

Java 8 및 Netty 4.1.1.Final을 사용하여 다음 테스트 케이스가 성공할 것으로 예상했지만 시간이 초과되었습니다. 내가 이해하지 못하는 것은 무엇입니까 w.r.t. nettys 이벤트 루프 및 작업 예약?Netty에서 예약 된 작업을 실행하지 않는 이유는 무엇입니까?

public class SchedulerTest { 


CountDownLatch latch; 

TimerHandler handler; 

static class TimerHandler extends ChannelInboundHandlerAdapter { 

    ChannelHandlerContext ctx; 

    @Override 
    public void channelActive(ChannelHandlerContext ctx) throws Exception { 
     super.channelActive(ctx); 
     this.ctx = ctx; 
    } 

    private void timeout(final long ms) { 
     ctx.executor().schedule(() -> { 
      ctx.fireUserEventTriggered(ms); 
     }, ms, TimeUnit.MILLISECONDS); 
    } 

} 

static class TimeoutReactor extends ChannelInboundHandlerAdapter { 
    CountDownLatch latch; 

    public TimeoutReactor(CountDownLatch latch) { 
     super(); 
     this.latch = latch; 
    } 

    @Override 
    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception { 
     System.out.println("userEventTriggered"); 
     latch.countDown(); 
     super.userEventTriggered(ctx, evt); 
    } 

} 

@Before 
public void setUp() throws Exception { 
    latch = new CountDownLatch(2); 
    handler = new TimerHandler(); 
    TimeoutReactor reactor = new TimeoutReactor(latch); 
    new EmbeddedChannel(handler, reactor); 
} 

@Test(timeout = 1000) 
public void test() throws InterruptedException { 

    handler.timeout(30); 
    handler.timeout(20); 
    latch.await(); 
} 

} 

답변

2

그 EmbeddedChannel 더 "실제"채널 구현하지 주로 사용-수를 테스트 및 임베디드 ChannelHandlers 위해 때문이다. 일정 기간이 지나면 "runPendingTasks()"를 호출하여 실행되도록해야합니다. "실제"채널 구현을 사용하면 추가 메서드 호출없이 작동합니다.

+0

확인. LocalAddress와 Bootstraps를 설정하지 않고도 LocalChannel에서 파이프 라인을 사용하는 "저렴한"방법이라고 생각했습니다. –