使用 sftp 出站网关下载文件后使用下载的文件名调用 bean 方法
Call a bean method with the downloaded filename after file download using sftp outbound gateway
我正在使用 int-sftp:outbound-gateway
下载远程文件。文件下载正在运行。下载文件后,无论成功还是失败,我都需要调用另一种方法。在那种方法中,我需要状态(成功或失败)和请求下载的文件的名称。然后从该方法我将根据状态启动 post 下载流程 - 将文件移动到不同位置,通知用户,发送电子邮件等。
我已经使用 AfterReturningAdviceInterceptor
调用了我自己在 MyAfterReturningAdvice
中定义的方法,该方法实现了 AfterReturningAdvice
接口。我用这个方法启动 post 下载流程。它确实执行了,我确实在 GenericMessage 的有效负载中获取了文件名。我的问题是,我们是否有更好的方法来实现这个流程。
我尝试使用 ExpressionEvaluatingRequestHandlerAdvice
的 onSuccessExpression,但无法调用其他方法。我所能做的就是操纵 inputMessage(GenericMessage 实例)。
在未来的冲刺中,我会将下载文件的校验和与预期校验和进行比较,如果校验和不匹配,我将重新下载文件固定次数。一旦校验和匹配,我需要再次调用 post 下载流程。如果下载失败甚至在最后一次重试时失败,那么我需要调用另一个流程(发送电子邮件、更新数据库、通知用户失败等)
我问这个问题只是为了确保我当前的实施符合总体要求。
<int:gateway id="downloadGateway" service-interface="com.rizwan.test.sftp_outbound_gateway.DownloadRemoteFileGateway"
default-request-channel="toGet"/>
<bean id="myAfterAdvice" class="org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor">
<constructor-arg>
<bean class="com.rizwan.test.sftp_outbound_gateway.MyAfterReturningAdvice">
</bean>
</constructor-arg>
</bean>
<int-sftp:outbound-gateway id="gatewayGet"
local-directory="C:\sftp-outbound-gateway"
session-factory="sftpSessionFactory"
request-channel="toGet"
remote-directory="/si.sftp.sample"
command="get"
command-options="-P"
expression="payload"
auto-create-local-directory="true">
<int-sftp:request-handler-advice-chain>
<ref bean="myAfterAdvice" />
</int-sftp:request-handler-advice-chain>
</int-sftp:outbound-gateway>
public class MyAfterReturningAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
//update db, send email, notify user.
}
}
ExpressionEvaluatingRequestHandlerAdvice.onSuccessExpression()
是您最好的选择。它的 EvaluationContext
是 BeanFactory
感知的,因此您绝对可以从该表达式调用任何 bean。作为根对象提供的 Message
是获取有关下载文件信息的良好候选者。
所以,这就是您可以在那里做的事情:
<bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
<property name="onSuccessExpressionString" value="@myBean.myMethod(#root)"/>
</bean>
您可以对 onFailureExpression
执行相同的操作。
另一方面,您甚至可能不需要担心表达式中的 bean 访问。 ExpressionEvaluatingRequestHandlerAdvice
有 successChannel
和 failureChannel
选项。因此,带有结果的消息可以发送到那里,一些 <service-activator>
和你的 bean 可以处理那个频道上的消息。
我正在使用 int-sftp:outbound-gateway
下载远程文件。文件下载正在运行。下载文件后,无论成功还是失败,我都需要调用另一种方法。在那种方法中,我需要状态(成功或失败)和请求下载的文件的名称。然后从该方法我将根据状态启动 post 下载流程 - 将文件移动到不同位置,通知用户,发送电子邮件等。
我已经使用 AfterReturningAdviceInterceptor
调用了我自己在 MyAfterReturningAdvice
中定义的方法,该方法实现了 AfterReturningAdvice
接口。我用这个方法启动 post 下载流程。它确实执行了,我确实在 GenericMessage 的有效负载中获取了文件名。我的问题是,我们是否有更好的方法来实现这个流程。
我尝试使用 ExpressionEvaluatingRequestHandlerAdvice
的 onSuccessExpression,但无法调用其他方法。我所能做的就是操纵 inputMessage(GenericMessage 实例)。
在未来的冲刺中,我会将下载文件的校验和与预期校验和进行比较,如果校验和不匹配,我将重新下载文件固定次数。一旦校验和匹配,我需要再次调用 post 下载流程。如果下载失败甚至在最后一次重试时失败,那么我需要调用另一个流程(发送电子邮件、更新数据库、通知用户失败等)
我问这个问题只是为了确保我当前的实施符合总体要求。
<int:gateway id="downloadGateway" service-interface="com.rizwan.test.sftp_outbound_gateway.DownloadRemoteFileGateway"
default-request-channel="toGet"/>
<bean id="myAfterAdvice" class="org.springframework.aop.framework.adapter.AfterReturningAdviceInterceptor">
<constructor-arg>
<bean class="com.rizwan.test.sftp_outbound_gateway.MyAfterReturningAdvice">
</bean>
</constructor-arg>
</bean>
<int-sftp:outbound-gateway id="gatewayGet"
local-directory="C:\sftp-outbound-gateway"
session-factory="sftpSessionFactory"
request-channel="toGet"
remote-directory="/si.sftp.sample"
command="get"
command-options="-P"
expression="payload"
auto-create-local-directory="true">
<int-sftp:request-handler-advice-chain>
<ref bean="myAfterAdvice" />
</int-sftp:request-handler-advice-chain>
</int-sftp:outbound-gateway>
public class MyAfterReturningAdvice implements AfterReturningAdvice {
@Override
public void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {
//update db, send email, notify user.
}
}
ExpressionEvaluatingRequestHandlerAdvice.onSuccessExpression()
是您最好的选择。它的 EvaluationContext
是 BeanFactory
感知的,因此您绝对可以从该表达式调用任何 bean。作为根对象提供的 Message
是获取有关下载文件信息的良好候选者。
所以,这就是您可以在那里做的事情:
<bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
<property name="onSuccessExpressionString" value="@myBean.myMethod(#root)"/>
</bean>
您可以对 onFailureExpression
执行相同的操作。
另一方面,您甚至可能不需要担心表达式中的 bean 访问。 ExpressionEvaluatingRequestHandlerAdvice
有 successChannel
和 failureChannel
选项。因此,带有结果的消息可以发送到那里,一些 <service-activator>
和你的 bean 可以处理那个频道上的消息。