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