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();
}
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
用于后期处理工作。