1

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

<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;
        }
    }
4

1 回答 1

0

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

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

为此,请考虑将filter选项添加到作为对or<int-ftp:inbound-channel-adapter>的引用。AcceptOnceFileListFilterFtpPersistentAcceptOnceFileListFilter

我们有一个关于这个问题的JIRA

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

于 2017-02-06T18:34:53.403 回答