Я новичок в верблюде и пишу небольшой POC для реализации в существующем приложении. Приложение принимает xml-запрос в качестве входных данных, который содержит запрошенные услуги и соответствующие данные. Затем он вызывает эти службы одну за другой. Когда служба вызывается успешно, я получаю код ответа http в процессоре, как показано ниже, и выполняю дальнейшую логику:
Object code = exchange.getIn().getHeader(Exchange.HTTP_RESPONSE_CODE);
if (null!=code && code instanceof Integer)
{
responseCode = (Integer) code;
}
В случае успеха полученный responseCode = 201
Основываясь на responseCode, я знаю, был ли вызов службы успешным, и перехожу к следующему.
Однако я попытался создать негативный сценарий, сделав неправильный URL-адрес службы и больше не вижу код ответа http:
Оригинальный URL сервиса - http://xxx:0000/.../.../.../.../...
Измененный URL сервиса - http://xxx:0000/.../.../.../.../abc/...
В случае неудачи полученный responseCode = null
В почтальоне я получаю следующую ошибку:
org.apache.camel.http.common.HttpOperationFailedException: HTTP operation failed invoking
http://xxx:0000/.../.../.../.../abc/...with statusCode: 404 at org.apache.camel.component.http.HttpProducer.populateHttpOperationFailedException(HttpProducer.java:274) at org.apache.camel.component.http.HttpProducer.process(HttpProducer.java:183)
Я не знаю, почему exchange не содержит код ответа http, когда он присутствует в сообщении об ошибке в почтальоне.
Я использую onException для обработки любых исключений, а затем вызываю процессор для дальнейшей обработки потока:
<camel:onException>
<camel:exception>java.lang.Exception</camel:exception>
<camel:process ref = "xxxProcessor" />
</camel:onException>
Я думаю, что могу рассматривать responseCode = null как сбой и продолжать свою логику, но хочу понять, почему код ответа возвращается как null.
Заранее спасибо!




Я понял. Кажется, что в случае исключения службы создается экземпляр org.apache.camel.http.common.HttpOperationFailedException и в нем присутствует код состояния http. Его можно получить в процессоре, как показано ниже:
Exception e = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, Exception.class);
if (null!=e && e instanceof HttpOperationFailedException)
{
HttpOperationFailedException httpOperationFailedException = (HttpOperationFailedException)e;
responseCode=httpOperationFailedException.getStatusCode();
}
Принятый ответ мне помог, и, возможно, он был действительным! В верблюжьей версии, которую я использую (2.20.1), получение исключения через свойство, похоже, не работает. Следующее делает
HttpOperationFailedException httpOperationFailedException = exchange.getException(HttpOperationFailedException.class);
if (null!=e) {
responseCode = httpOperationFailedException.getStatusCode());
}
Проголосовали и в то же время добавили ответ, который заставил меня работать