Spring integration setOnFailureExpression不适用于#根和#异常

Spring integration setOnFailureExpression不适用于#根和#异常,spring-integration,spring-integration-dsl,Spring Integration,Spring Integration Dsl,这是意料之中的事 逻辑是这样的: payload: org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice$MessageHandlingExpressionEvaluatingAdviceException: Handler Failed; nested exception is org.springframework.messaging.MessageHandlingExc

这是意料之中的事

逻辑是这样的:

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}]
试试看{
evalResult=this.onFailureExpression.getValue(PrepareEvaluationContextouse(异常),消息);
}
捕获(例外e){
evalResult=e;
logger.error(“针对“+message+”:“+e.getMessage()”)的失败表达式计算失败);
}
DestinationResolver channelResolver=getChannelResolver();
if(this.failureChannel==null&&this.failureChannelName!=null&&channelResolver!=null){
this.failureChannel=channelResolver.resolveDestination(this.failureChannelName);
}
if(evalResult!=null&&this.failureChannel!=null){
MessaginException MessaginException=
新MessageHandlingExpressionEvaluatingAdviceException(消息“处理程序失败”,
如有必要(例外情况),可取消包装(evalResult);
ErrorMessage ErrorMessage=新的ErrorMessage(MessaginException);
this.messagingTemplate.send(this.failureChannel,errorMessage);
}
onFailureExpression
的计算结果将作为属性添加到
messagehandlingexpressionevaluationingadviceexception
中。此异常被包装到
错误消息
,发送到配置的
故障通道

因此,到目前为止,您的代码是正确的,除非您忽略了这样一个事实,即您在
rtwFtpFailureHandlerFlow
中处理的消息的
payload
正是所提到的
MessageHandlingExpressionEvaluatingAdviceException
。要访问表达式的结果,需要对此异常强制转换一个
有效负载
,并调用其
getEvaluationResult()
。另一方面,您甚至不需要任何复杂的表达式,因为请求消息作为此异常的
failedMessage
可用。另外,真正的失败是这个异常的原因

有关更多信息,请参阅文档:

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}]
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);
    }