如何在 Netty 通道中调度 HttpRequest?

How to schedule HttpRequest in Netty channel?

我需要使用一个连接(http keep-alive)发出多个请求,并且我想在它们之间添加延迟。现在在我的最后一个处理程序中,我在接收到上一个请求的 LastHttpContent 后在通道中写入下一个 HttpRequest:

@Override
public void channelRead0(ChannelHandlerContext ctx, HttpObject msg) {
   ...
   if (msg instanceof LastHttpContent) {
      ...
      ctx.channel().writeAndFlush(nextHttpRequest);
      ...
   }
}

我想使用 Thread.sleep 会阻塞整个 netty 反应堆,所以我正在寻找一种正确的方法来延迟写入通道。

您可以安排一个任务来使用 ChannelContext 的执行程序编写消息:

public class ScheduledHttpWriter extends SimpleChannelInboundHandler<HttpObject> {

    @Override
    protected void channelRead0(ChannelHandlerContext ctx, HttpObject msg) throws Exception {
        if (msg instanceof LastHttpContent) {
            ctx.executor().schedule(new Runnable(){
                @Override
                public void run() {
                    ctx.channel().writeAndFlush(outBoundMessage);
                }
            }, 1000, TimeUnit.MILLISECONDS);
        }               
    }

}