如何根据spring集成中的一些验证将文件从一个目录移动到另一个目录?

时间:2018-03-02 21:09:07

标签: java spring spring-integration dsl

Spring集成轮询目录中的文件,对其进行一些验证然后我想将其移动到另一个目录。如何实现同样的目标?

@Bean
public IntegrationFlow inboundFileIntegration(@Value("${inbound.file.poller.fixed.delay}") long period,
                                              @Value("${inbound.file.poller.max.messages.per.poll}") int maxMessagesPerPoll,
                                              TaskExecutor taskExecutor,
                                              MessageSource<File> fileReadingMessageSource
                                             ) {



    return IntegrationFlows
            .from(fileReadingMessageSource,
                    c -> c.poller(Pollers.fixedDelay(period)
                            .taskExecutor(taskExecutor)
                            .maxMessagesPerPoll(maxMessagesPerPoll)))
                            .channel(ApplicationConfiguration.INBOUND_CHANNEL)
            .filter(validateDeal, "validate", e -> e.discardFlow(sf -> sf.handle(fileImproperEmailwriter,"sendEmail")))

            .channel(ApplicationConfiguration.OUTBOUND_CHANNEL)
            .get();
}

1 个答案:

答案 0 :(得分:0)

FileReadingMessageSource将这些标题填充到邮件中:

return getMessageBuilderFactory()
                .withPayload(file)
                .setHeader(FileHeaders.RELATIVE_PATH,
                        file.getAbsolutePath()
                                .replaceFirst(Matcher.quoteReplacement(
                                        this.directory.getAbsolutePath() + File.separator), ""))
                .setHeader(FileHeaders.FILENAME, file.getName())
                .setHeader(FileHeaders.ORIGINAL_FILE, file);

因此,您始终可以访问原始文件。要将其移至不同的路径,您可以使用java.nio.file.Files.move(Path source, Path target, CopyOption... options)实用程序。并且确实在流程中的某个地方使用它。

不幸的是,您展示的流程没有任何线索,您根本不会移动文件。另一方面,我们不清楚为什么您无法在ApplicationConfiguration.OUTBOUND_CHANNEL订阅方执行该操作,以便通过验证的文件和discardFlow()中的其他移动。您始终可以使用PublishSubscribeChannel让多个订阅者为同一消息执行某些并行工作。

<强>更新

@Bean(name = ApplicationConfiguration.OUTBOUND_CHANNEL)
MessageChannel myOutboundChannel() {
    return new PublishSubscribeChannel();
}

由于你已经使用.channel(ApplicationConfiguration.OUTBOUND_CHANNEL),因此将使用这个bean。我猜你有一些订阅者或IntegrationFlow来使用这个频道。您想要做的事情应该表示为一个订阅者或适当的IntegrationFlow用于后期处理工作。