Spring 集成 - 包括错误的负载
Spring Integration - including payload in errors
我正在尝试将 inputMessage 负载包含在错误中,但它似乎从未被传递并且充实似乎也不起作用。
我有目录轮询服务:
<file:inbound-channel-adapter
id="incomingFiles"
auto-startup="true"
auto-create-directory="false"
channel="myFiles"
filename-pattern="${directory.local.pattern}"
directory="file:${directory.local}">
<int:poller id="poller" fixed-delay="${directory.local.poll}"/>
</file:inbound-channel-adapter>
随后将通过 SFTP 上传这些文件:
<sftp:outbound-channel-adapter
id="sftpOutboundAdapter"
channel="myFiles"
charset="UTF-8"
remote-directory="${directory.remote}"
session-factory="sftpSessionFactory">
<sftp:request-handler-advice-chain>
<bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
<property name="onSuccessExpression" value="payload.delete()"/>
<property name="successChannel" ref="successChannel"/>
<property name="onFailureExpression" value="payload.renameTo(payload.absolutePath + '.error')"/>
<property name="failureChannel" ref="failChannel" />
</bean>
</sftp:request-handler-advice-chain>
</sftp:outbound-channel-adapter>
在成功通道上,我记录它并通过 successChannel 发送它,另一个服务接收它并发送电子邮件,这 100% 有效:
<!-- Log Channel -->
<int:logging-channel-adapter id="logChannel" level="INFO"/>
<!-- Success Endpoint -->
<int:channel id="successChannel">
<int:interceptors>
<int:wire-tap channel="successLogChannel"/>
</int:interceptors>
</int:channel>
<!-- Success Logging -->
<int:channel id="successLogChannel"/>
<int:transformer
input-channel="successLogChannel"
output-channel="logChannel"
expression="'Successfully transferred ' + inputMessage.payload.absolutePath"/>
<!-- Send success email -->
<int:chain input-channel="successChannel">
<int:header-enricher>
<int:header name="to" value="${success.email.to}"/>
<int:header name="from" value="${success.email.from}" />
<int:header name="subject" value="${success.email.subject}"/>
<int:header name="filename" expression="inputMessage.payload.absolutePath"/>
</int:header-enricher>
<int:service-activator ref="Email" method="sendSuccessMail"/>
</int:chain>
org.springframework.integration.handler.LoggingHandler - Successfully
transferred /tmp/test-file.dat
现在当我尝试完全相同的错误时,表达式 inputMessage.payload.filename
无法计算。
<!-- Fail Endpoint -->
<int:channel id="failChannel">
<int:interceptors>
<int:wire-tap channel="failLogChannel"/>
</int:interceptors>
</int:channel>
<!-- Fail Logging -->
<int:channel id="failLogChannel"/>
<int:transformer
input-channel="failLogChannel"
output-channel="logChannel"
expression="'Failed to transfer ' + inputMessage.payload.absolutePath"/>
<!-- Send fail email -->
<int:chain input-channel="failChannel">
<int:header-enricher>
<int:header name="to" value="${fail.email.to}"/>
<int:header name="from" value="${fail.email.from}" />
<int:header name="subject" value="${fail.email.subject}"/>
<int:header name="filename" expression="inputMessage.payload.absolutePath"/>
</int:header-enricher>
<int:service-activator ref="Email" method="sendFailMail"/>
</int:chain>
ERROR org.springframework.integration.handler.LoggingHandler -
org.springframework.integration.transformer.MessageTransformationException:
org.springframework.integration.MessageHandlingException: Expression
evaluation failed: 'Failed to transfer ' +
inputMessage.payload.absolutePath
我试过添加一个 header enricher,但当出现错误时,负载似乎永远不会离开 SFTP 出站通道:
<!-- Fail Endpoint -->
<int:channel id="failChannel"/>
<int:chain input-channel="failChannel" output-channel="failChannelEnriched">
<int:header-enricher>
<int:header name="to" value="${fail.email.to}"/>
<int:header name="from" value="${fail.email.from}"/>
<int:header name="subject" value="${fail.email.subject}"/>
<int:header name="filename" expression="inputMessage.payload.absolutePath"/>
</int:header-enricher>
</int:chain>
<int:channel id="failChannelEnriched">
<int:interceptors>
<int:wire-tap channel="failLogChannel"/>
</int:interceptors>
</int:channel>
<!-- Fail Logging -->
<int:channel id="failLogChannel"/>
<int:transformer
input-channel="failLogChannel"
output-channel="logChannel"
expression="'Failed to transfer ' + headers['filename']"/>
<!-- Send fail email -->
<int:chain input-channel="failChannelEnriched">
<int:service-activator ref="Email" method="sendFailMail"/>
</int:chain>
ERROR org.springframework.integration.handler.LoggingHandler -
org.springframework.integration.transformer.MessageTransformationException:
org.springframework.integration.MessagingException: failed to
transform message headers
...
Caused by:
org.springframework.expression.spel.SpelEvaluationException:
EL1008E:(pos 0): Field or property 'inputMessage' cannot be found on
object of type 'org.springframework.integration.message.ErrorMessage'
at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:246)
查看 spring 文档,我可以看到 org.springframework.integration.message.ErrorMessage
确实接受 headers,但不知为何它没有被设置。
有什么建议吗?
为了成功,一个特殊的 AdviceMessage
被发送到频道;这有 inputMessage
属性(有效载荷是表达式求值的结果)。
对于错误情况,正常的ErrorMessage
发送到频道;它的有效载荷是
具有正常属性的 MessagingException
:cause
(发生的异常)和 failedMessage
.
实际的异常是 MessageHandlingExpressionEvaluatingAdviceException
,它有一个额外的 属性 evaluationResult
包含表达式计算的结果。
因此,对于失败案例,您需要一个不同的表达式 payload.failedMessage.payload.absolutePath
。
我正在尝试将 inputMessage 负载包含在错误中,但它似乎从未被传递并且充实似乎也不起作用。
我有目录轮询服务:
<file:inbound-channel-adapter
id="incomingFiles"
auto-startup="true"
auto-create-directory="false"
channel="myFiles"
filename-pattern="${directory.local.pattern}"
directory="file:${directory.local}">
<int:poller id="poller" fixed-delay="${directory.local.poll}"/>
</file:inbound-channel-adapter>
随后将通过 SFTP 上传这些文件:
<sftp:outbound-channel-adapter
id="sftpOutboundAdapter"
channel="myFiles"
charset="UTF-8"
remote-directory="${directory.remote}"
session-factory="sftpSessionFactory">
<sftp:request-handler-advice-chain>
<bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
<property name="onSuccessExpression" value="payload.delete()"/>
<property name="successChannel" ref="successChannel"/>
<property name="onFailureExpression" value="payload.renameTo(payload.absolutePath + '.error')"/>
<property name="failureChannel" ref="failChannel" />
</bean>
</sftp:request-handler-advice-chain>
</sftp:outbound-channel-adapter>
在成功通道上,我记录它并通过 successChannel 发送它,另一个服务接收它并发送电子邮件,这 100% 有效:
<!-- Log Channel -->
<int:logging-channel-adapter id="logChannel" level="INFO"/>
<!-- Success Endpoint -->
<int:channel id="successChannel">
<int:interceptors>
<int:wire-tap channel="successLogChannel"/>
</int:interceptors>
</int:channel>
<!-- Success Logging -->
<int:channel id="successLogChannel"/>
<int:transformer
input-channel="successLogChannel"
output-channel="logChannel"
expression="'Successfully transferred ' + inputMessage.payload.absolutePath"/>
<!-- Send success email -->
<int:chain input-channel="successChannel">
<int:header-enricher>
<int:header name="to" value="${success.email.to}"/>
<int:header name="from" value="${success.email.from}" />
<int:header name="subject" value="${success.email.subject}"/>
<int:header name="filename" expression="inputMessage.payload.absolutePath"/>
</int:header-enricher>
<int:service-activator ref="Email" method="sendSuccessMail"/>
</int:chain>
org.springframework.integration.handler.LoggingHandler - Successfully transferred /tmp/test-file.dat
现在当我尝试完全相同的错误时,表达式 inputMessage.payload.filename
无法计算。
<!-- Fail Endpoint -->
<int:channel id="failChannel">
<int:interceptors>
<int:wire-tap channel="failLogChannel"/>
</int:interceptors>
</int:channel>
<!-- Fail Logging -->
<int:channel id="failLogChannel"/>
<int:transformer
input-channel="failLogChannel"
output-channel="logChannel"
expression="'Failed to transfer ' + inputMessage.payload.absolutePath"/>
<!-- Send fail email -->
<int:chain input-channel="failChannel">
<int:header-enricher>
<int:header name="to" value="${fail.email.to}"/>
<int:header name="from" value="${fail.email.from}" />
<int:header name="subject" value="${fail.email.subject}"/>
<int:header name="filename" expression="inputMessage.payload.absolutePath"/>
</int:header-enricher>
<int:service-activator ref="Email" method="sendFailMail"/>
</int:chain>
ERROR org.springframework.integration.handler.LoggingHandler - org.springframework.integration.transformer.MessageTransformationException: org.springframework.integration.MessageHandlingException: Expression evaluation failed: 'Failed to transfer ' + inputMessage.payload.absolutePath
我试过添加一个 header enricher,但当出现错误时,负载似乎永远不会离开 SFTP 出站通道:
<!-- Fail Endpoint -->
<int:channel id="failChannel"/>
<int:chain input-channel="failChannel" output-channel="failChannelEnriched">
<int:header-enricher>
<int:header name="to" value="${fail.email.to}"/>
<int:header name="from" value="${fail.email.from}"/>
<int:header name="subject" value="${fail.email.subject}"/>
<int:header name="filename" expression="inputMessage.payload.absolutePath"/>
</int:header-enricher>
</int:chain>
<int:channel id="failChannelEnriched">
<int:interceptors>
<int:wire-tap channel="failLogChannel"/>
</int:interceptors>
</int:channel>
<!-- Fail Logging -->
<int:channel id="failLogChannel"/>
<int:transformer
input-channel="failLogChannel"
output-channel="logChannel"
expression="'Failed to transfer ' + headers['filename']"/>
<!-- Send fail email -->
<int:chain input-channel="failChannelEnriched">
<int:service-activator ref="Email" method="sendFailMail"/>
</int:chain>
ERROR org.springframework.integration.handler.LoggingHandler - org.springframework.integration.transformer.MessageTransformationException: org.springframework.integration.MessagingException: failed to transform message headers
...
Caused by: org.springframework.expression.spel.SpelEvaluationException: EL1008E:(pos 0): Field or property 'inputMessage' cannot be found on object of type 'org.springframework.integration.message.ErrorMessage'
at org.springframework.expression.spel.ast.PropertyOrFieldReference.readProperty(PropertyOrFieldReference.java:246)
查看 spring 文档,我可以看到 org.springframework.integration.message.ErrorMessage
确实接受 headers,但不知为何它没有被设置。
有什么建议吗?
为了成功,一个特殊的 AdviceMessage
被发送到频道;这有 inputMessage
属性(有效载荷是表达式求值的结果)。
对于错误情况,正常的ErrorMessage
发送到频道;它的有效载荷是
具有正常属性的 MessagingException
:cause
(发生的异常)和 failedMessage
.
实际的异常是 MessageHandlingExpressionEvaluatingAdviceException
,它有一个额外的 属性 evaluationResult
包含表达式计算的结果。
因此,对于失败案例,您需要一个不同的表达式 payload.failedMessage.payload.absolutePath
。