[英]Exception handling Camel Apache
我是Camel Apache的新手,在處理異常時遇到了一些麻煩。 我想要做的是捕獲SalesforceException,然后從那里根據statusCode采取不同的操作。
例如,當statusCode> = 500時,我必須嘗試重新傳遞該消息。 這是一個技術錯誤。 當statusCode <500時,我必須組合請求和響應並將其放置在failureQueue上。
所以我的問題是: 如何嘗試在選擇定義中重新傳遞消息? 似乎無法使用可以在onException上使用的以下選項:
.handled(true).useOriginalMessage().maximumRedeliveries(3)
.redeliveryDelay(5000)
.logRetryAttempted(true)
.retryAttemptedLogLevel(LoggingLevel.WARN)
我還嘗試拋出自己定義的新異常,以便可以從那里處理它,但是看起來FatalFallbackErrorHandler接管了我,因為我自己無法處理它,所以我無能為力。 因此,我的第二個問題-如果在choicedefinition中沒有重新發送它的答案- 如何在沒有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)
您應該能夠使用一對onException(SalesforceException.class)塊,並使用onWhen(Predicate)縮小每個塊。
onException(SalesforceException.class)
.onWhen(new Predicate() {
@Override
public boolean matches(Exchange exchange) {
SalesforceException cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, SalesforceException.class);
return cause.getStatusCode() < 500;
}
})
.log("Handled here if statusCode < 500")
.useOriginalMessage()
.handled(true)
.maximumRedeliveries(3)
.redeliveryDelay(5000)
.logRetryAttempted(true);
onException(SalesforceException.class)
.onWhen(new Predicate() {
@Override
public boolean matches(Exchange exchange) {
SalesforceException cause = exchange.getProperty(Exchange.EXCEPTION_CAUGHT, SalesforceException.class);
return cause.getStatusCode() >= 500;
}
})
.log("Handled here if statusCode >= 500")
.transform(ExpressionBuilder.simpleExpression("{\"request\" : ${exchangeProperty.requestBody}, \"response\" : ${exchangeProperty.response}}"))
.to("log:{{logger}}?level=INFO&showHeaders=true")
.to("amqp:qFailure?exchangePattern=InOnly");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.