setOnFailureExpression not working for #root and #exception

老子叫甜甜 提交于 2019-12-11 09:05:06

问题


@Bean
public ExpressionEvaluatingRequestHandlerAdvice after() {
    logger.debug("Evaluating expression advice. ");
    ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
    advice.setTrapException(true);
    advice.setOnFailureExpressionString("#root");
    advice.setSuccessChannel(rtwSourceDeletionChannel());
    advice.setFailureChannel(rtwFtpFailureHandleChannel());
    advice.setPropagateEvaluationFailures(true);
    return advice;
}

@Bean
public IntegrationFlow rtwFtpFailureHandlerFlow() {
    return IntegrationFlows
                .from(rtwFtpFailureHandleChannel())
                .handle( msg -> {
                    // code to delete all files except source. 
                    logger.debug("Handling Failure......");

                    List<String> transitPaths = (List<String>) msg.getHeaders().get(AdviceHandlerMessageHeaders.TRANSIT_PATHS); 
                    String sourcePath = (String) msg.getHeaders().get(AdviceHandlerMessageHeaders.SOURCE); 

                    System.out.println("payload: " + msg.getPayload());
                    })
                .get();
}

Produces same result for #root and #exception as below:

payload: org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice$MessageHandlingExpressionEvaluatingAdviceException: Handler Failed; nested exception is org.springframework.messaging.MessageHandlingException: error occurred in message handler [rtwFtpOutboundHandler]; nested exception is org.springframework.messaging.MessagingException: Failed to execute on session; nested exception is org.springframework.integration.util.PoolItemNotAvailableException: Failed to obtain pooled item, failedMessage=GenericMessage [payload=sample.pdf, headers={file_name=sample.pdf, TRANSIT_PATHS=[\\localhost\atala-capture-upload, sample.tif], SOURCE=\\localhost\atala-capture-upload, file_originalFile=\\localhost\atala-capture-upload\sample.tif, id=746728a4-9b9e-847f-6c2c-29aa8a4a5fd6, file_relativePath=sample.tif, timestamp=1549922458296}], failedMessage=GenericMessage [payload=sample.pdf, headers={file_name=sample.pdf, TRANSIT_PATHS=[\\localhost\atala-capture-upload, sample.tif], SOURCE=\\localhost\atala-capture-upload, file_originalFile=\\localhost\atala-capture-upload\sample.tif, id=746728a4-9b9e-847f-6c2c-29aa8a4a5fd6, file_relativePath=sample.tif, timestamp=1549922458296}]

回答1:


That works as expected.

The logic is like this:

try {
        evalResult = this.onFailureExpression.getValue(prepareEvaluationContextToUse(exception), message);
    }
    catch (Exception e) {
        evalResult = e;
        logger.error("Failure expression evaluation failed for " + message + ": " + e.getMessage());
    }
    DestinationResolver<MessageChannel> channelResolver = getChannelResolver();
    if (this.failureChannel == null && this.failureChannelName != null && channelResolver != null) {
        this.failureChannel = channelResolver.resolveDestination(this.failureChannelName);
    }
    if (evalResult != null && this.failureChannel != null) {
        MessagingException messagingException =
                new MessageHandlingExpressionEvaluatingAdviceException(message, "Handler Failed",
                        unwrapThrowableIfNecessary(exception), evalResult);
        ErrorMessage errorMessage = new ErrorMessage(messagingException);
        this.messagingTemplate.send(this.failureChannel, errorMessage);
    }

The evaluation result of the onFailureExpression is added to the MessageHandlingExpressionEvaluatingAdviceException as property. And this exception is wrapped to the ErrorMessage to be sent to the configured failureChannel.

So, your code is correct so far, unless you are missing the fact that payload of the message you process in that rtwFtpFailureHandlerFlow is exactly the mentioned MessageHandlingExpressionEvaluatingAdviceException. To get access to the result of your expression, you need to cast a payload to this exception and call its getEvaluationResult(). On the other hand you even don't need to have have any complex expression since a request message is available as a failedMessage of this exception. Plus the real failure is in the cause of this exception.

See docs for more info: https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints-chapter.html#expression-advice



来源:https://stackoverflow.com/questions/54639853/setonfailureexpression-not-working-for-root-and-exception

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!