Netty中的同步HTTP调用
我的应用程序接收到一个HTTP请求,在流水线的中间,调用另一个服务器来支持信息。在响应返回之前,初始HTTP请求无法通过管道继续。我不能从I/O线程中使用Netty中的同步HTTP调用,http,netty,event-driven,Http,Netty,Event Driven,我的应用程序接收到一个HTTP请求,在流水线的中间,调用另一个服务器来支持信息。在响应返回之前,初始HTTP请求无法通过管道继续。我不能从I/O线程中使用waitingunterruptability(),那么进行这些调用的最佳方法是什么,这样我就不会阻止Netty的事件循环,但是,在我的呼叫返回之前,请暂停客户的管道,我告诉管道继续?我想你需要一个。我想你需要一个。Ryan这听起来不是个好主意 我认为你最好使用这样的东西: public class HttpHandler extends Si
waitingunterruptability()
,那么进行这些调用的最佳方法是什么,这样我就不会阻止Netty的事件循环,但是,在我的呼叫返回之前,请暂停客户的管道,我告诉管道继续?我想你需要一个。我想你需要一个。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中处理它。但是我想你明白了这听起来不是个好主意 我认为你最好使用这样的东西:
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
context将入站上下文传递到匿名函数),但当我没有从入站管道显式调用sendUpstream
时,原始管道继续向下游处理程序发送。好吧,Norman是正确的,我只是看不清楚。我的代码中也有一个bug,该bug并行执行另一个步骤,而该步骤本应是稍后执行的单独管道处理程序。jist是指客户机事件管道在客户机完成工作时向上游发送父上下文。只要确保在客户端执行调用之后没有任何可能导致并行执行的内容(这是不需要的)。因此,该示例中的ctx
就是出站HTTP请求的上下文。因此,向上游发送事件只会向上游发送出站请求的事件。当调用operationComplete
时,我需要从入站HTTP请求向上游发送事件,但不能更早。我尝试向上游发送原始事件(通过final
context将入站上下文传递到匿名函数),但当我没有从入站管道显式调用sendUpstream
时,原始管道继续向下游处理程序发送。好吧,Norman是正确的,我只是看不清楚。我的代码中也有一个bug,该bug并行执行另一个步骤,而该步骤本应是稍后执行的单独管道处理程序。jist是指客户机事件管道在客户机完成工作时向上游发送父上下文。只要确保在客户端执行调用之后没有任何可能导致并行执行(这是不需要的)的内容。。。我会在上午试一试,看看它是否符合我的需要。谢谢我在文档中看到了新OrderedMemoryAwareThreadPoolExecutor(1610485761048576),我很好奇这些参数值是否非常常见,或者是否应该进行调整,如果是,调整它们的标准是什么。这些数字当然完全是任意的。您的数字完全取决于您的特定运行时间;具体地说,计算对象内存使用量是很困难的。最好的方法可能是在负载变化时测量堆,估计特定执行器的消耗,并设置一个“保守”限制。。。我会在上午试一试,看看它是否符合我的需要。谢谢我在文档中看到了新OrderedMemoryAwareThreadPoolExecutor(1610485761048576),我很好奇这些参数值是否非常常见,或者是否应该进行调整,如果是,调整它们的标准是什么。这些数字当然完全是任意的。您的数字完全取决于您的特定运行时间;具体地说,计算对象内存使用量是很困难的。最好的方法可能是在负载变化期间测量堆,估计特定执行器的消耗,并设置“保守”限制。