我使用netty 4.0.25Final编写一个netty HTTP服务器.我需要根据HTTP GET请求中的一些参数在管道中添加各种处理程序.
pipeline.addLast(new HttpRequestDecoder(4096, 8192, 8192, false),
                 new HttpResponseEncoder(),
                 new HttpObjectAggregator(1048576),
                 decisionHandler
                 );
Run Code Online (Sandbox Code Playgroud)
如果多个请求来自同一连接,则使用相同的管道.Request1可能需要Handler1,Request2可能需要Handler2而Request3可能需要Handler3.假设请求以Request1,Request2,Request3的形式出现.Request1将修改管道以添加Handler1.
在后续调用中,我们是否总是需要检查pipleline是否已被修改,然后删除不需要的处理程序?然后添加处理该特定调用所需的处理程序?
或者我应该在转到下一个处理程序(fireChannelRead(object))之前删除处理程序?它会对性能产生影响吗?
有没有其他方法可以做到这一点?
感谢和问候,
Tanima
tru*_*tin 12
动态操纵管道是相对昂贵的操作.如果您尝试实现的只是一个简单的切换案例,例如委托,您可以编写一个执行该操作的处理程序.例如:
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);
        } ...
    }
}
Run Code Online (Sandbox Code Playgroud)
请注意,handler[1|2|3]不需要ChannelInboundHandler真的.您可以定义一个非常简单的界面,如下所示:
public interface ChannelMessageHandler {
    void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception;
}
Run Code Online (Sandbox Code Playgroud)
        |   归档时间:  |  
           
  |  
        
|   查看次数:  |  
           1614 次  |  
        
|   最近记录:  |