我使用netty 4.0.25Final编写一个netty HTTP服务器。我需要根据HTTP GET请求中的一些参数在管道中添加各种处理程序。
pipeline.addLast(new HttpRequestDecoder(4096, 8192, 8192, false),
new HttpResponseEncoder(),
new HttpObjectAggregator(1048576),
decisionHandler
);
如果多个请求来自同一连接,则使用相同的管道。 Request1可能需要Handler1,Request2可能需要Handler2而Request3可能需要Handler3。假设请求以Request1,Request2,Request3的形式出现。 Request1将修改管道以添加Handler1。
在后续调用中,我们是否始终需要检查pipleline是否已被修改,然后删除不需要的处理程序?然后添加处理该特定调用所需的处理程序?
或者我应该在转到下一个处理程序(fireChannelRead(object))之前删除处理程序?会对性能产生影响吗?
还有其他办法吗?
谢谢&的问候,
Tanima
答案 0 :(得分:10)
动态操作管道是相对昂贵的操作。如果您尝试实现的只是一个简单的切换案例,例如委托,您可以编写一个执行该操作的处理程序。例如:
public class SwitchCaseHandler extends ChannelInboundHandlerAdapter {
private final ChannelInboundHandler handler1 = ...;
private final ChannelInboundHandler handler2 = ...;
private final ChannelInboundHandler handler3 = ...;
...
@Override
public void channelRead(ctx, msg) {
if (isForHandler1(msg)) {
handler1.channelRead(ctx, msg);
} else if (isForHandler2(msg)) {
handler2.channelRead(ctx, msg);
} ...
}
}
请注意,handler[1|2|3]
并非真正需要ChannelInboundHandler
。您可以定义一个非常简单的界面,如下所示:
public interface ChannelMessageHandler {
void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception;
}