【问题标题】:Synchronous HTTP call in NettyNetty 中的同步 HTTP 调用
【发布时间】:2012-05-08 16:36:32
【问题描述】:

我的应用收到一个 HTTP 请求,在管道的中间,调用另一个服务器以获取支持信息。在响应返回之前,初始 HTTP 请求无法继续通过管道。我不能在 I/O 线程中使用 awaitUninterruptability(),那么进行这些调用的最佳方法是什么,这样我就不会阻止 Netty 的事件循环,而是将客户端的管道暂停,直到我的调用返回并且我告诉管道继续?

【问题讨论】:

  • 在摆弄了一段时间之后,我认为我在正确的轨道上。我现在正在做的是将同一管道处理程序的另一个实例添加到堆栈中,紧跟在当前处理程序之后,并传入响应处理程序。然后向上游发送。然后我检查该响应处理程序是否已完成(处理程序中的自定义方法),如果没有,则将处理程序的另一个实例添加到管道中,依此类推。本质上是创建一个处理程序循环,当响应返回时将“中断”。我现在唯一的问题是我在响应返回之前溢出了处理程序上的堆栈......

标签: http netty event-driven


【解决方案1】:

Ryan 这听起来不是个好主意..

我认为你最好使用类似的东西:

public class HttpHandler extends SimpleChannelUpstreamHandler{

    @Override
    public void messageReceived(final ChannelHandlerContext ctx, final MessageEvent e) throws Exception {
        otherChannel.write(yourRequet).addListener(new ChannelFutureListener() {

            public void operationComplete(ChannelFuture future) throws Exception {

                // once the write is done we can continue in the pipeline
                ctx.sendUpstream(e);
            }
        });

        // the event stops here to get processed

    }

}

如果您需要等待响应,则需要在另一个 SimpleChannelUpstreamHandler 中处理它。但我想你明白了..

【讨论】:

  • 因此,该示例中的 ctx 是出站 HTTP 请求的上下文。因此,向上游发送事件仅针对出站请求向上游发送事件。当进行operationComplete 调用时,我需要从入站HTTP 请求向上游发送事件,但不会更早。我尝试向上游发送原始事件(通过final 上下文将入站上下文传递到匿名函数),但是当我没有明确调用sendUpstream 时,原始管道继续到下游 处理程序来自入站管道。
  • 好吧,诺曼说的没错,只是我没看清楚。我的代码中还有一个错误,当它应该是稍后执行的单独管道处理程序时,它正在并行执行另一个步骤。要点是客户端事件管道在客户端完成工作时触发父上下文 sendUpstream。只要确保在客户端执行调用之后没有任何可能导致并行执行的东西(这是不需要的)。
【解决方案2】:

我猜你需要ExecutionHandler

【讨论】:

  • 有趣...我会在上午尝试一下,看看它是否符合我的需要。谢谢!
  • 我在文档new OrderedMemoryAwareThreadPoolExecutor(16, 1048576, 1048576) 中看到,我很好奇这些参数值是否很常见,或者是否应该调整它们,如果是,调整它们的标准是什么。跨度>
  • 这些数字当然是完全任意的。您的数字完全取决于您的特定运行时间;具体来说,您有多少堆可供使用 - 计算对象内存使用量可能很困难。最好的方法可能是在不同负载期间测量堆,估计特定执行程序的消耗,并设置“保守”限制。
猜你喜欢
  • 1970-01-01
  • 2016-04-24
  • 2018-09-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多