在spring-ftp中一次又一次地拾取相同的文件,但名称不同

时间:2017-02-06 17:06:34

标签: spring-integration spring-integration-sftp

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

<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服务器映像 -

enter image description here

这是我的本地目录图片 -

enter image description here

我不明白为什么一次又一次地拾取同一个文件。我会感激一些帮助!

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

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

1 个答案:

答案 0 :(得分:0)

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

你应该确保这种能力,因为它没有默认切换。

为此,请考虑在filter添加<int-ftp:inbound-channel-adapter>选项作为AcceptOnceFileListFilterFtpPersistentAcceptOnceFileListFilter的参考。

我们对此事有JIRA

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