问题
@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