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

问题描述 投票:0回答:1

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();
}
java spring spring-integration dsl
1个回答
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让几个订阅者为同一个消息执行一些并行工作。

UPDATE

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

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

© www.soinside.com 2019 - 2024. All rights reserved.