如何使用来自 Spring Integration 的 File Watcher 仅用于等待,而不是用于移动?

How to use File Watcher from Spring Integration only for Waiting, NOT for Moving?

我正在学习 Spring 在 Spring 启动应用程序中的集成,我需要制作一个应用程序来等待文件夹中的 .txt 文件,然后进行一些处理,并且然后将生成的 .txt 文件放在另一个文件夹中。

所以应用程序应该等待输入文件夹中的 inputxxx.txt 个文件,然后进行一些处理,然后将生成的 outputxxx.txt 个文件放入输出文件夹中。 inputxxx.txt 文件应保留在输入文件夹中,输出文件夹中应只有 outputxxx.txt 文件。

@Configuration
@EnableIntegration
public class ApplicationConfig {

    @Bean
    public MessageChannel fileChannel() {
        return new DirectChannel();
    }

    @Bean
    @InboundChannelAdapter(value = "fileChannel", poller = @Poller(fixedDelay = "1000"))
    public MessageSource<File> fileReadingMessageSource() {

        SimplePatternFileListFilter filter = new SimplePatternFileListFilter(FILE_PATTERN);
        return new FilePoller(directory, filter);
    }

    @Bean
    @ServiceActivator(inputChannel = "fileChannel")
    public MessageHandler fileWritingMessageHandler() {
        return new FileHandler(OUTPUT_LOCATION);
    }
}

FilePoller class:

public class FilePoller extends FileReadingMessageSource {

    public FilePoller(File directory, FileListFilter<File> filter) {
        super.setDirectory(directory);
        super.setFilter(filter);
    }
}

所以我不想使用 move() 方法,因为 JAXB 会做我想做的,但是如果我删除 move() 我的应用程序不会停止。

谢谢!我们将不胜感激任何反馈!

您的问题在这里:

    SimplePatternFileListFilter filter = new SimplePatternFileListFilter(FILE_PATTERN);
    return new FilePoller(directory, filter);

您只需检查特定的文件类型,但不会保护您的程序在下一个轮询周期中选取相同的文件。

请考虑使用 ChainFileListFilter,其中第一个是第一个,但第二个必须是 AcceptOnceFileListFilter

这样您就可以完全忽略原始文件而只专注于您的输出文件。 下一个轮询周期不会再次选取原始文件。

对于程序重新启动之间的永久无知,您应该考虑使用 FileSystemPersistentAcceptOnceFileListFilter

在文档中查看更多信息:

https://docs.spring.io/spring-integration/docs/current/reference/html/file.html#file-reading