You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置ExpressionEvaluatingRequestHandlerAdvice实现SFTP文件失败续传

问题分析与解决

核心问题:Advice配置位置错误

你当前把ExpressionEvaluatingRequestHandlerAdvice加到了Poller的advice()里,这是错误的——这个Advice是用来拦截消息处理阶段的逻辑(也就是SFTP文件下载的处理逻辑),而Poller的advice()是用于拦截轮询任务本身(比如轮询触发的重试、轮询前的预处理),两者作用阶段完全不同。错误的配置导致Advice没有正确拦截文件下载的异常,反而阻断了整个消息流。

正确的配置方式是把Advice加到SFTP入站适配器的requestHandlerAdviceChain中,而不是Poller上:

ExpressionEvaluatingRequestHandlerAdvice advice = new ExpressionEvaluatingRequestHandlerAdvice();
advice.setFailureChannel(err);
advice.setTrapException(true);

// 不要给Advice设置successChannel,让消息走默认流到out通道
// advice.setSuccessChannel(out);

IntegrationFlow integrationFlow = IntegrationFlows
        .from(Sftp.inboundAdapter(cachingSessionFactory)
                .remoteDirectory("sftpSource")
                .deleteRemoteFiles(false)
                .preserveTimestamp(true)
                .localDirectory(getTargetLocalDirectory())
                // 把Advice加到适配器的请求处理器链中
                .requestHandlerAdviceChain(advice), 
             e -> e.id("sftpInboundAdapter")
                .poller(Pollers.fixedDelay(100)
                        .maxMessagesPerPoll(3)))
        .channel(out)
        .get();

你的疑问解答

1. Poller的.errorChannel(err)与集成流的.channel(out)配置问题

  • Poller的.errorChannel(err):不需要移除,但它的作用是处理轮询任务本身的异常(比如SFTP连接失败导致轮询无法触发),和单个文件下载失败的异常无关。单个文件的异常由你配置的ExpressionEvaluatingRequestHandlerAdvice处理即可。
  • 集成流的.channel(out):不能直接移除,因为入站适配器必须有一个默认的输出通道。你之前的问题是同时给Advice设置了successChannel(out)和流里加了.channel(out),导致消息被重复路由,引发冲突。解决办法是不要给Advice设置successChannel,让成功处理的文件消息默认走流里的.channel(out)即可,这样既不会报错,也能保证消息正常流转。

2. setTrapException(true)后,SftpPersistentAcceptOnceFileListFilter是否标记失败文件为已处理?

不会。SftpPersistentAcceptOnceFileListFilter的逻辑是:只有当文件成功下载到本地后,才会将文件的元数据(文件名、修改时间)存入持久化存储(比如默认的SimpleMetadataStore),标记为已处理,下一次轮询会跳过该文件。

当setTrapException(true)时,Advice只是捕获了文件下载的异常并发送到failureChannel,但此时文件下载逻辑已经失败,过滤器不会执行标记已处理的操作,下一次轮询会重新尝试处理该失败的文件。如果想要避免重复处理失败文件,可以在failureChannel的处理逻辑中手动将该文件标记为已处理(比如调用MetadataStore的put方法)。


内容的提问来源于stack exchange,提问作者kacpr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 15:00:44