【问题标题】:Multiple handlers in nettynetty 中的多个处理程序
【发布时间】:2012-04-18 16:10:01
【问题描述】:

我想在 netty 中做一种日志代理。目标是能够让 Web 浏览器向 netty 服务器发出 HTTP 请求,将它们传递到后端 Web 服务器,而且还能够基于 HTTP 特定的事物采取某些行动。

有几个有用的网络示例,HexDumpProxy(它执行代理部分,与协议无关),我从 HttpSnoopServerHandler 中获取了一些代码。

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

//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)?

【问题讨论】:

    标签: java proxy netty


    【解决方案1】:

    我没有尝试过,但您可以扩展 HexDumpProxyInboundHandler 并使用类似的东西覆盖 messageReceived

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

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

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

    【讨论】:

    • 我试过了,和我想要的比较接近,但是还是有问题。大多数请求都被正确代理,但其中一些请求最终被截断了前几百个字节,这导致对后端服务器的请求无效(并且页面不呈现或根本不返回)。看起来 HttpRequestDecoder 在代理可以发送之前消耗了一些请求。
    • 在将缓冲区写入网络的代码和 HttpRequestDecoder 之间可能存在竞争条件,因为它们都将操作同一个缓冲区对象。尝试向上游发送原始缓冲区的打包版本或副本。
    • 当我修改 HexDumpProxyInboundHandler 以执行 outboundChannel.write(msg.copy()) 或 outboundChannel.write(msg.duplicate()) 时它起作用,我不确定知道哪个有什么区别一个要使用,我在stackoverflow.com/questions/10215001/… 发布了另一个问题
    猜你喜欢
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 2013-03-06
    • 2014-01-15
    • 2015-06-07
    • 1970-01-01
    • 1970-01-01
    • 2019-10-11
    相关资源
    最近更新 更多