什么是简单文件复制的正确Java配置

时间:2016-09-14 17:03:20

标签: spring-integration

我对Spring非常陌生,对Spring Integration来说更是如此,如果这是一个非常基本的问题,请道歉。

我想构建一个非常基本的日志文件处理器来学习绳索。与此非常相似:example

我也想使用java配置方法,我所关注的大部分示例都是XML驱动的,而且我很难进行翻译。

最终,我希望以递归方式轮询源目录以查找日志文件,并使用持久性存储来跟踪已找到的内容。

然后,将要处理的文件复制到处理文件夹,然后启动弹出批处理作业以处理文件的内容。

当一切都完成后,可以从处理位置删除已处理的文件。

我似乎无法找到正确的方法来连接(使用SpEL的常规java配置)流程。此外,我仍然不确定应该是什么样的东西。

这些文件移动的基本高级线路再次出现:

file:inbound-channel-adapter -> channel -> file:outbound-adapter

basic sample

这是我到目前为止所拥有的

修改

我已使用Artem的解决方案进行了更新。我的源文件现在已正确复制到目标位置。谢谢Artem!

最终我仍面临同样的问题。立即找到要扫描的文件(并立即填充metadata-store.properties文件),但文件会慢慢复制到目标文件夹。如果发生崩溃,任何尚未复制到目标文件夹的源文件将基本上“丢失”#34;。也许我需要查看其他形式的持久性存储,例如自定义jdbcfilter。

@Value("${logProcessor.filenamePattern}")
private String filenamePattern;

@Value("${logProcessor.sourceDirectory}")
private String sourceDirectory;

@Value("${logProcessor.processingDirectory}")
private String processingDirectory;

@Bean
@InboundChannelAdapter(channel = "sourceFileChannel", poller = @Poller(fixedRate = "5000"))
public MessageSource<File> sourceFiles() {

        CompositeFileListFilter<File> filters = new CompositeFileListFilter<>();
        filters.addFilter(new SimplePatternFileListFilter(filenamePattern));
        filters.addFilter(persistentFilter());

        FileReadingMessageSource source = new FileReadingMessageSource();
        source.setAutoCreateDirectory(true);
        source.setDirectory(new File(sourceDirectory));
        source.setFilter(filters);
        source.setUseWatchService(true);

        return source;
    }

@Bean
@InboundChannelAdapter(channel = "processingFileChannel", poller = @Poller(fixedRate = "5000"))
    public MessageSource<File> processingFiles() {

        CompositeFileListFilter<File> filters = new CompositeFileListFilter<>();
        filters.addFilter(new SimplePatternFileListFilter(filenamePattern));

        FileReadingMessageSource source = new FileReadingMessageSource();
        source.setAutoCreateDirectory(true);
        source.setDirectory(new File(processingDirectory));
        source.setFilter(filters);

        return source;
    }

@Bean
@ServiceActivator(inputChannel = "sourceFileChannel")
public MessageHandler fileOutboundChannelAdapter() {
    FileWritingMessageHandler adapter = new FileWritingMessageHandler(new File(processingDirectory));
    adapter.setDeleteSourceFiles(false);
    adapter.setAutoCreateDirectory(true);
    adapter.setExpectReply(false);
    return adapter;
}


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

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

    @Bean
    public DefaultDirectoryScanner defaultDirectoryScanner() {
        return new DefaultDirectoryScanner();
    }

    @Bean
    public FileSystemPersistentAcceptOnceFileListFilter persistentFilter() {
        FileSystemPersistentAcceptOnceFileListFilter fileSystemPersistentAcceptOnceFileListFilter = new FileSystemPersistentAcceptOnceFileListFilter(metadataStore(), "");
        fileSystemPersistentAcceptOnceFileListFilter.setFlushOnUpdate(true);
        return fileSystemPersistentAcceptOnceFileListFilter;
    }

    @Bean
    public PropertiesPersistingMetadataStore metadataStore(){
        PropertiesPersistingMetadataStore metadataStore = new PropertiesPersistingMetadataStore();
        metadataStore.setBaseDirectory("C:\\root\\code\\logProcessor");
        return metadataStore;
    }

1 个答案:

答案 0 :(得分:1)

到目前为止你的配置还不错。

执行如此复杂的任务,我不确定如何帮助你。

你应该问更具体的问题。我们无法为您编写解决方案。

不确定为什么需要将文件从一个目录复制到另一个目录,如果您只需从源目录中轮询它们,存储在metadataStore中并开始文件处理。

所以,我发现配置中存在一个小问题。 FileWritingMessageHandler将结果发送到processingFileChannel,同样由第二个FileReadingMessageSource完成。我不确定这是你的意图。以防万一你注意。

您可能还需要了解FileSplitter,它可让您逐行处理文件。

你也说processingDirectory,但是你使用tmpDir作为FileWritingMessageHandler,我想这是假设您的复制逻辑。

让我们一步一步完成任务!然后你弄明白了什么,在哪里以及如何使用!

修改

如果你只是需要将文件复制到processingDirectory而没有任何回复,你应该做单行适配器:

@Bean
@ServiceActivator(inputChannel = "sourceFileChannel")
public MessageHandler fileOutboundChannelAdapter() {
    FileWritingMessageHandler adapter = new FileWritingMessageHandler(new File(processingDirectory));
    adapter.setDeleteSourceFiles(true);
    adapter.setAutoCreateDirectory(true);
    adapter.setExpectReply(false);
    return adapter;
}

然后你的@InboundChannelAdapter(channel = "processingFileChannel"可以选择要处理的文件。

不确定您需要DeleteSourceFiles但是......