gpt4 book ai didi

java - 为什么Netty不执行我的定时任务?

转载 作者:行者123 更新时间:2023-12-01 18:03:51 24 4
gpt4 key购买 nike

使用 Java 8 和 Netty 4.1.1.Final,我预计以下测试用例会成功,但它超时了。我不明白什么是w.r.t.nettys事件循环和任务调度?

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();
}

}

最佳答案

这是因为 EmbeddedChannel 不是“真正的”Channel 实现,主要可用于测试和嵌入式 ChannelHandler。您需要在给定时间范围后调用“runPendingTasks()”才能运行它。如果您使用“真正的” Channel 实现,它将无需任何额外的方法调用即可工作。

关于java - 为什么Netty不执行我的定时任务?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38412579/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com