Я новичок в Camel Apache и у меня проблемы с обработкой исключений.Я пытаюсь поймать SalesforceException, и оттуда мне нужно предпринять различные действия, основанные на statusCode.
Например, когда statusCode> = 500, я должен попытаться повторно доставить сообщение.Это техническая ошибка.Когда statusCode <500, я должен объединить запрос и ответ и поместить его в errorQueue. </p>
Поэтому мой вопрос: как мне попытаться повторно доставить сообщение в определении выбора? Кажется невозможным использовать следующие опции, которые вы можете использовать в onException:
.handled(true).useOriginalMessage().maximumRedeliveries(3)
.redeliveryDelay(5000)
.logRetryAttempted(true)
.retryAttemptedLogLevel(LoggingLevel.WARN)
Я также попытался выдать новые исключения, которые я определил сам, чтобы я мог обработать это оттуда, но тогда это выглядит как FatalFallbackErrorHandler принимаети у меня нет сил, потому что я не могу справиться с этим самостоятельно.Итак, мой второй вопрос - если нет ответа на повторную отправку в определении выбора - как я могу обработать его в пользовательском исключении без принятия ErrorHandler?
Вот мой код:
onException()
.logStackTrace(true);
onException(SalesforceException.class)
.process(new Processor() {
@Override
public void process(Exchange exchange) throws Exception {
SalesforceException cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, SalesforceException.class);
exchange.setProperty("statusCode", cause.getStatusCode());
exchange.setProperty("response", cause.getMessage());
}
})
.choice()
.when(header("statusCode").isGreaterThanOrEqualTo(500))
// try to redeliverd the orginal message
.log(LoggingLevel.WARN, "{{logger}}", "Salesforce exception caught with statusCode >= 500")
.throwException(new SalesforceTechnicalException())
.otherwise()
// combine request & response and put on failurequeue
.log(LoggingLevel.WARN, "{{logger}}", "Salesforce exception caught with statusCode < 500, following message will be put on failure queue")
.throwException(new SalesforceFunctionalException())
.end();
onException(SalesforceTechnicalException.class)
//combine request & response and put on failurequeue
.transform(ExpressionBuilder.simpleExpression("{\"request\" : ${exchangeProperty.requestBody}, \"response\" : ${exchangeProperty.response}}"))
.to("log:{{logger}}?level=INFO&showHeaders=true")
.to("amqp:qFailure?exchangePattern=InOnly");
onException(SalesforceTechnicalException.class)
//try resending the orginal message to SF Rest API
.useOriginalMessage()
.handled(true)
.maximumRedeliveries(3)
.redeliveryDelay(5000)
.logRetryAttempted(true)