netty中的多个处理程序

时间:2012-04-17 19:20:10

标签: java proxy netty

我想在netty中创建一种日志记录代理。目标是能够让Web浏览器向netty服务器发出HTTP请求,将它们传递给后端Web服务器,还能够根据HTTP特定的事情采取某些操作。

有一些有用的netty exmaples,HexDumpProxy(代理部分,与协议无关),我只从HttpSnoopServerHandler中获取了一些代码。

我的代码现在看起来像这样: 可以在http://docs.jboss.org/netty/3.2/xref/org/jboss/netty/example/proxy/HexDumpProxyInboundHandler.html

找到HexDumpProxyInboundHandler
//in HexDumpProxyPipelineFactory
  public ChannelPipeline getPipeline() throws Exception {
      ChannelPipeline p = pipeline(); // Note the static import.
      p.addLast("handler", new HexDumpProxyInboundHandler(cf, remoteHost, remotePort));

      p.addLast("decoder", new HttpRequestDecoder());
      p.addLast("handler2", new HttpSnoopServerHandler());
      return p;
  }


//HttpSnoopServerHandler
public class HttpSnoopServerHandler extends SimpleChannelUpstreamHandler {
  public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {
    HttpRequest request = (HttpRequest) e.getMessage();
    System.out.println(request.getUri());
    //going to do things based on the URI
  }
}

不幸的是,HttpSnoopServerHandler中的messageReceived永远不会被调用 - 看起来像HexDumpProxyInboundHandler会消耗所有事件。

我怎么能有两个处理程序,其中一个需要解码器但另一个不需要(我宁愿使用HexDumpProxy,它不需要理解HTTP,它只代理所有连接,但我的HttpSnoopHandler需要在它前面有HttpRequestDecoder)?

1 个答案:

答案 0 :(得分:1)

我没有尝试过,但你可以扩展HexDumpProxyInboundHandler并覆盖messageReceived,例如

super.messageReceived(ctx, e);
ctx.sendUpstream(e);

或者你可以直接修改HexDumpProxyInboundHandler,即messageReceived做的最后一件事是调用super.messageReceived(ctx,e)。

这仅适用于来自客户端的入站数据。来自您代理的服务的数据仍然会在您没有代码查看的情况下传递。