【问题标题】:Same file gets picked up again and again in spring-ftp but with different names在 spring-ftp 中一次又一次地获取相同的文件,但名称不同
【发布时间】:2025-12-31 19:25:05
【问题描述】:

我有一个这样定义的弹簧输入通道

<file:inbound-channel-adapter prevent-duplicates="false" id="inpChannel" directory="file:/Users/abhisheksingh/req" auto-startup="true">
        <int:poller id="poller" fixed-delay="1000" />
</file:inbound-channel-adapter>

<int:service-activator input-channel="inpChannel" ref="inpHandler" />

文件名示例为 TEST.SQQ。 SQQ 是客户端用来将文件放在 ftp 中的文件格式。但是,我看到 spring ftp 适配器一次又一次地使用不同的文件名拾取同一个文件。所以第一次是TEST.SQQ。然后下一次是 TEST.SQQ-20170204.PQQ 下一次是 TEST.SQQ-20170204.PQQ.20170304.PQQ。这一直在继续。我有一个过滤器,用于检查已处理文件的名称。但由于每次轮询的文件名都不同,因此所有这些文件都被挑选出来进行处理。

这是我的 ftp 适配器 -

<int-ftp:inbound-channel-adapter id="sqqFtpInbound"
    channel="ftpChannel"
    session-factory="sqqFtpClientFactory"
    auto-create-local-directory="true"
    delete-remote-files="false"
    local-filter="acceptAllFileListFilter"
    local-directory="file:/Users/abhisheksingh/ddrive/everge_ws/sqqReq" auto-startup="true" >
    <int:poller id="poller" fixed-delay="1000" />
</int-ftp:inbound-channel-adapter>

这是我的 ftp 服务器映像 -

这是我的本地目录图片-

我不明白为什么同一个文件会一次又一次地被拾取。我将不胜感激!

这是我的文件列表过滤代码。

public class TestFileListFilter<F> extends AbstractFileListFilter<F> {

    private static final Logger log = LoggerFactory.getLogger(EvergeFileListFilter.class);

    @Override
    protected boolean accept(F file) {
        File f = (File) file;
        if(f.getAbsolutePath().contains(".PQQ")) {

            String newDir = "/Users/abhisheksingh/ddrive/sample/pqqReq/";

            String archiveLocation = "/Users/abhisheksingh/ddrive/sample/pqqArchive/";
            String fullName = archiveLocation + f.getName();
            log.info("Check if the file has already been processed " + fullName);

            File fl = new File(fullName);
            final File dir = new File(archiveLocation);
            for (final File child : dir.listFiles()) {

                String archiveName = FilenameUtils.getBaseName(child.getName());
                String inputName = FilenameUtils.getBaseName(fl.getName());
                log.info("Archive file name is " + archiveName);
                log.info("Input file name is " + inputName);
                if(inputName.contains(archiveName)) {
                    log.info("The file is already processed "+inputName);
                }

            }

            if(fl.exists()) {
                log.error("PQQ file has already been processed.");
                removeFile(f);
                return false;
            }else{
                log.info("PQQ File received " + f.getAbsolutePath());
            }
            moveFile(f, newDir);
            return true;
        }
    }

【问题讨论】:

  • 您知道,您的问题并不清楚。 TEST.SQQEST.SQQ-20170204.PQQTEST.SQQ-20170204.PQQ.20170304.PQQ 是真正不同的文件名......也不知道你为什么要向我们展示 &lt;file:inbound-channel-adapter&gt;。请改写你的问题。我还看到您的&lt;int-ftp:inbound-channel-adapter&gt; 没有任何filter 用于远程目录。
  • 远程位置只有一个文件 - TEST.SQQ。如果同一个文件再次被轮询,那没关系。我归档已处理的文件。但是,每次 sqqFtpInbound 适配器选择文件时,相同的文件都会返回并以不同的不同名称存储在我的本地文件存储中。因此,我不得不一次又一次地处理文件。
  • 问题陈述很清楚。远程目录只有一个文件。当入站适配器轮询它并且我的本地过滤器开始处理它时,我得到具有不同名称的文件名。我展示了所有配置,只是为了确保我没有搞砸任何配置。
  • 我不想为远程目录添加任何过滤器。
  • 我还告诉SQQ保存一些客户信息。实际名称是 PQQ。从我附上的图片可以看出这一点。似乎千言万语无法解释图像的作用。

标签: spring-integration spring-integration-sftp


【解决方案1】:

我认为您的自定义 local-filter 存在一些漏洞,可以依靠不存在的事实来等待来自远程存储的唯一文件。

您应该确保该功能,因为默认情况下它不会切换。

为此,考虑将filter 选项添加到&lt;int-ftp:inbound-channel-adapter&gt; 作为对AcceptOnceFileListFilterFtpPersistentAcceptOnceFileListFilter 的引用。

我们有关于此事的JIRA

请确认这确实是您的问题,我们可能会修改该票证的优先级,并会尽快解决。

【讨论】:

  • @artem_bilan,感谢您花时间回答我的问题。我通过了JIRA。它说没有默认过滤器,每次我们轮询所有文件时。这对我来说没问题。但是,当再次轮询同一文件时,会附加一些时间戳。我不知道这个魔法是怎么发生的。至少名称不应该改变。
  • 我已经用 TestFileListFilter 代码更新了我的问题。对我来说,它看起来很简单。我不认为有任何漏洞。如果您发现代码有任何问题,请告诉我。
  • “每次我们轮询所有文件。这对我来说没问题”。 ???您有一个问题“我不明白为什么同一个文件会一次又一次地被拾取”。我给你一个答案。还有什么?
  • 文件名中的那些时间戳对我来说也很奇怪。框架中没有什么对我们有什么帮助。因此,看起来您的应用程序中有一些自定义逻辑。从您那里获得尽可能小的配置来从我们这边玩会很棒。我不认为FileListFilter应该有这么辛苦的工作。这真的不是它的责任。
  • @artem_bilan ,所以过滤器中存在一些漏洞。我已经修好了。感谢您花时间在这上面。我只是对这个spring ftp有一个后续问题。即使我在 tomcat 中停止了应用程序,我仍然看到文件仍在轮询。所以我做了什么来复制这个 - 我停止了应用程序。我删除了本地目录中的所有文件。我看到轮询文件重新出现。为了验证这一点,我重命名了 ftp 上的文件并从本地删除了轮询文件。现在重命名的文件出现了。我已经执行了./shutdown.sh。所以应用程序停止了。
最近更新 更多