簡體   English   中英

異常處理Camel Apache

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM