我有一个应用程序,我使用 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
在我的真实业务处理程序中不被调用,因为如果输入太大,我不想再继续了。但是,我目前看到两个我想解决的问题:
exceptionCaught
被多次调用。我想在第一次发生时发送一条格式良好的消息,然后永久终止对该请求的处理。- 因为它被多次调用,我在日志中看到了以下内容
java.lang.IllegalStateException
::不能发送比请求更多的响应 - 在客户端,我收到以下错误::
org.apache.http.NoHttpResponseException
目标服务器无法响应
我在这里做错了什么?
谢谢,