Netty如何处理HttpChunkAggregator上的异常

时间:2013-08-21 19:58:38

标签: java netty

我有一个应用程序,我使用HttpChunkAggregator来避免处理块,因为我需要将整个输入解析为一个单元来创建json节点。由于HttpChunkAggregator必须采用maxContentLength,因此我需要处理传入请求超出内容大小的情况,我想向客户端返回一个很好的格式化错误消息。这就是我在做的事情:

1:子类HttpChunkAggregator并覆盖exceptionCaught方法

public class MyHttpChunkAggregator extends HttpChunkAggregator {

public MyHttpChunkAggregator(int maxContentLength) {
    super(maxContentLength);
}   

//@Override

public void exceptionCaught(ChannelHandlerContext context, ExceptionEvent ee)
        throws Exception {      
if (ee.getCause() instanceof TooLongFrameException) {           

logger.log(Level.WARNING, "Exception caught in channel handler", ee.getCause());

HttpResponse httpResponse;

try {

 //build a http response

 httpResponse = //call my function here to build a response

    ee.getChannel().write(httpResponse);

    ee.getChannel().close();
        } catch (IOException ioe) {
            Throwables.propagate(ioe);
        }
    }
  }
}

2:将我的自定义处理程序添加到管道

ChannelPipeline p = Channels.pipeline();

p.addLast("requestDecoder", new HttpRequestDecoder());

p.addLast("responseEncoder", new HttpResponseEncoder());

p.addLast("chunkAggregator", new MyHttpChunkAggregator(1048576)));

//adding the real business handle class to parse the input content

通过这样做,我能够实现messageRecived不在我的真实业务处理程序中调用,因为如果输入太大,我不想再继续了。但是,我目前看到两个我想解决的问题:

  1. exceptionCaught被多次调用。我想在第一次发送时发送一个很好的格式化消息,然后永久终止处理此请求。
  2. 因为它被多次调用,我在日志中看到以下内容: java.lang.IllegalStateException:无法发送比请求更多的回复
  3. 在客户端,我收到以下错误: org.apache.http.NoHttpResponseException:目标服务器无法响应
  4. 我在这里做错了什么?

    谢谢,

0 个答案:

没有答案