使用sftp出站网关下载文件后,使用下载的文件名调用bean方法

时间:2018-02-02 04:50:43

标签: spring spring-integration spring-el spring-integration-sftp

我正在使用int-sftp:outbound-gateway下载远程文件。文件下载正在运行。我需要在下载文件后调用另一个方法,以获得成功和失败。在该方法中,我需要状态(成功或失败)以及请求下载的文件的名称。然后从该方法我将根据状态启动后期下载流程 - 将文件移动到不同位置,通知用户,发送电子邮件等。

我使用AfterReturningAdviceInterceptor来调用我自己在MyAfterReturningAdvice中定义的方法,该方法实现了AfterReturningAdvice接口。用这个我的方法来启动帖子下载流程。它确实执行,我在GenericMessage的有效负载中获取文件名。我的问题是,我们是否有更好的方法来实现这一流程。

我尝试使用ExpressionEvaluatingRequestHandlerAdvice的onSuccessExpression但是我不能调用另一种方法。我所能做的就是操纵inputMessage(GenericMessage实例)。

在将来的冲刺中,如果存在校验和不匹配,我将比较下载文件的校验和与预期的校验和,并重新下载文件一段固定次数。一旦校验和匹配,我再次需要调用后期下载流程。如果即使在最后一次重试时下载失败,那么我需要调用另一个流(发送电子邮件,更新数据库,通知用户失败等)。 我问这个问题只是为了确保我目前的实施符合总体要求                                                      

<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.
    }
}

1 个答案:

答案 0 :(得分:1)

ExpressionEvaluatingRequestHandlerAdvice.onSuccessExpression()是您的最佳选择。它的EvaluationContextBeanFactory - 意识到,因此你绝对可以从该表达式中调用任何bean。作为根对象提供的Message是获取有关下载文件的信息的良好候选者。

所以,这就是你可以做的事情:

<bean class="org.springframework.integration.handler.advice.ExpressionEvaluatingRequestHandlerAdvice">
    <property name="onSuccessExpressionString" value="@myBean.myMethod(#root)"/>
</bean>

您可以使用onFailureExpression

另一方面,您甚至不必担心表达式对bean的访问。 ExpressionEvaluatingRequestHandlerAdvicesuccessChannelfailureChannel个选项。因此,带有结果的消息可以在那里发送,并且一些<service-activator>与您的bean可以处理该通道上的消息。