We are having akka - camel - netty environment, while communicating with the host, akka default dispacher sends multiple requests to the host.For example akka-default-dispacher-1 sends two requests Request1 and Request2.
The Problem: The host is a standard banking service provider and sends 500 status code when it wants to send error response to the client along with the SOAP response message.
The response is then interpreted in the following fashion:
if (errorCause instanceof NettyHttpOperationFailedException) {
NettyHttpOperationFailedException exception = (NettyHttpOperationFailedException) error.getCause();
if (exception != null) {
Integer statusCode = exception.getStatusCode();
if (statusCode != null && statusCode == 500) {
errorFlag = true;
HttpResponse httpResponse = (HttpResponse) exception.getResponse();
if (httpResponse != null) {
ChannelBuffer responseBuffer = httpResponse.getContent();
final byte[] body = responseBuffer.array();
String errorBody = new String(body);
}
}
}
}
When host responds with http status 500 for Request1, netty supposedly closes the channel and the response for Request2 is not collected.
As a solution to this we found two methods to override this behaviour:
1. Set the throwExceptionOnFailure to false (true by default), so that netty does not do any error handling and response for Request2 is captured.
2.Set okStatusCodeRange=200-500, so that 500 response is not considered as error response and netty error handling for 500 is supressed.
However, both the above approaches have their own flaws, for instance if we receive http response 400 or 404 or 405 for approach (2), they will be considered as good responses and will not be handled.
Desired approach: Netty should not close channel when it receives 500 response Or There should be a provision to suppress specific http response code and not the entire range.
Or any other approach or configuration that can done to resolve the above issue.