当前位置: 首页 > 知识库问答 >
问题:

Spring Integration-SFTP文件同步-当文件名相同但时间戳不同时不生成消息

牟飞沉
2023-03-14

我已经用SFTPinboundFileSynchronizingMessageSource配置了我的应用程序。我希望一个消息被接收与文件作为结果有效载荷每当一个新的文件被发现(即,一个新的文件名和/或时间戳)。以下是我所拥有的:

@Bean
public SftpInboundFileSynchronizer sftpInboundFileSynchronizer() {
    SftpInboundFileSynchronizer fileSynchronizer = new SftpInboundFileSynchronizer(sftpSessionFactory());
    fileSynchronizer.setDeleteRemoteFiles(false);
    fileSynchronizer.setRemoteDirectory(applicationProperties.getSftpDirectory());
    CompositeFileListFilter<ChannelSftp.LsEntry> compositeFileListFilter = new CompositeFileListFilter<ChannelSftp.LsEntry>();
    compositeFileListFilter.addFilter(new SftpPersistentAcceptOnceFileListFilter(store, "sftp"));
    compositeFileListFilter.addFilter(new SftpSimplePatternFileListFilter(applicationProperties.getLoadFileNamePattern()));
    fileSynchronizer.setFilter(compositeFileListFilter);
    fileSynchronizer.setPreserveTimestamp(true);
    return fileSynchronizer;
}

@Bean
@InboundChannelAdapter(autoStartup="true", channel = "sftpChannel", poller = @Poller("pollerMetadata"))
public SftpInboundFileSynchronizingMessageSource sftpMessageSource() {
    SftpInboundFileSynchronizingMessageSource source =
            new SftpInboundFileSynchronizingMessageSource(sftpInboundFileSynchronizer());
    source.setLocalDirectory(applicationProperties.getScheduledLoadDirectory());
    source.setAutoCreateLocalDirectory(true);
    CompositeFileListFilter<File> compositeFileFilter = new CompositeFileListFilter<File>();
    compositeFileFilter.addFilter(new LastModifiedFileListFilter());
    compositeFileFilter.addFilter(new FileSystemPersistentAcceptOnceFileListFilter(store, "dailyfilesystem"));
    source.setLocalFilter(compositeFileFilter);
    source.setCountsEnabled(true);
    return source;
}

除了在随后的轮询中获得相同的文件名和不同的修改后的时间戳的情况之外,这种方法很有效。在这种情况下,我得到消息的空结果。当时间戳不同但文件名相同时,如何确保生成消息?

共有1个答案

王棋
2023-03-14

看起来您现有的本地副本(旧副本)正在下游某个地方忙碌。资源已打开。因此适配器不能重写它。

最近已经修复:https://jira.spring.io/browse/int-4305

 类似资料:
  • 它以名称camera0-00001.jpg,camera0-00002.jpg等保存我的文件。 然后我根据修改后的文件时间,用camera0-HH-mm-ss-(1-30).jpeg重命名我的文件。 所以最后我有4个相同时间和相同帧的文件,像这样:camera0-12-00-00-1.jpeg camera1-12-00-00-1.jpeg camera2-12-00-00-1.jpeg came

  • 问题内容: 我正在尝试仅将原始文件从一个目录复制到另一个目录,但是某些文件具有相同的名称…我正在尝试使用哈希来比较文件,如果其不在目录中发送并且名称相同,它到file_name.something。目前,我正在获取一些文件,并且具有相同名称的文件正在被覆盖…任何人都可以提出建议吗? 问题答案: 您将哈希与文件名进行比较。你需要类似的东西 计算目标文件夹中每个文件的哈希值。 此外,在当前版本中,您的

  • 我发现有多个环境(例如test和prod),但我希望启动的Docker容器在这两个环境中是相同的。唯一的区别是应用程序配置,我希望使用来指定它。因为我有多个容器和它们之间的依赖关系,所以我想使用docker-compose。但是afaik I只能在文件中指定(请参见文档)。如果是这种情况,那么我需要将原来的克隆到两个不同的文件(一个用于test,一个用于prod),以指向不同的env文件。这意味着

  • 我有两个类,它们具有相同的类名并使用相同的包名。但是,这两个类文件位于不同的目录中。这两个类之间的另一个不同之处是,每个类中都有其他类中没有的方法。本质上,我想将这些方法拆分为两个使用相同名称但不同文件夹的单独文件。 理论上,我认为这是可能的,因为Java编译器在构建输出时确实维护了目录结构。所以在运行时,如果在类中调用了一个方法,Java可能会在任何一个文件中找到该方法。 这可能吗?我使用的是I

  • 关于警告: 我尝试在不使用的情况下构建它。它构建了相同的

  • 问题内容: 我正在做一个大项目,该项目很可能最终包含成千上万行代码,对于当前结构,我喜欢这样: 这样做的问题是controllers和models目录包含很多文件,全部使用和。因此,我正在考虑将其拆分为: 凡在控制器包的用户文件中可能包含的文件,等等。 现在,我读到像或那样的软件包是不好的做法,但是我担心对这两个软件包进行命名可能不是一个好主意,因为它们是同一项目的一部分(即使它们位于不同的目录中