在文件完全加载时生成integrationflowbuilder进程文件

a0x5cqrl  于 2021-07-23  发布在  Java
关注(0)|答案(1)|浏览(363)

我有一个将文件下载到特定位置的应用程序。还有另一个应用程序使用integrationflowbuilder从该位置读取文件,我希望我的第二个应用程序仅在文件完全加载时处理。下面是我的第二个应用程序如何使用该文件。

FileInboundChannelAdapterSpec fileInboundChannelAdapterSpec = Files
                .inboundAdapter(Paths.get(dir.toFile(), comparingLong(File::lastModified));

        fileInboundChannelAdapterSpec.patternFilter(pattern.get());

        fileInboundChannelAdapterSpec.preventDuplicates(true);

        IntegrationFlowBuilder integrationFlowBuilder = IntegrationFlows.from(fileInboundChannelAdapterSpec);

为什么要通过修改integrationflowbuilder中的某些内容来实现这一点。

dwbf0jvd

dwbf0jvd1#

如果您的第一个应用程序通过tmp文件写入文件,然后在完成向文件写入内容后将其重命名为目标名称,那就太好了。因此,在分别重命名目标文件之前,目标文件对轮询应用程序不可见。
另一个技巧是通过 LastModifiedFileListFilter :

/**
 * The {@link FileListFilter} implementation to filter those files which
 * {@link File#lastModified()} is less than the {@link #age} in comparison
 * with the current time.
 * <p>
 * The resolution is done in seconds.
 * <p>
 * When {@link #discardCallback} is provided, it called for all the
 * rejected files.
 *
 * @author Gary Russell
 * @author Artem Bilan
 *
 * @since 4.2
 *
 */
public class LastModifiedFileListFilter implements DiscardAwareFileListFilter<File> {

尽管这不是完全可靠的方法,因为您无法预先猜测文件的写入时间。
另一种方法是通过一些文件锁定技巧来实现,但是这样你就需要再次修改producer应用程序。
查看文档中有关筛选器的更多信息:https://docs.spring.io/spring-integration/docs/current/reference/html/file.html#file-阅读

相关问题