我有一个 Spring Integration Batch 作业,当文件到达时会触发该作业:
@Bean
public IntegrationFlow fileTriggeredIntegrationFlow() {
return IntegrationFlows.from(fileReadingMessageSource(),
c -> c.poller(Pollers.fixedRate(filePollerFrequency, filePollerInitialDelay)))
.transform(toJobLaunchRequest())
.handle(jobLaunchingGateway)
.handle("jobCompletionHandler", "afterJob")
.get();
}
@Bean
public FileReadingMessageSource fileReadingMessageSource() {
FileReadingMessageSource sourceReader = new FileReadingMessageSource();
log.info("Listening for {} files at {}", sourceFilePattern, sourceFileDirectory);
sourceReader.setDirectory(new File(sourceFileDirectory));
sourceReader.setFilter(new RegexPatternFileListFilter(sourceFilePattern));
return sourceReader;
}
长期以来一直非常顺利,但最近我遇到了问题,即作业针对同一输入文件运行了两次。以下是日志文件的片段:
2018-12-06 13:52:32,595 INFO [task-scheduler-7] o.s.i.f.FileReadingMessageSource:380 - Created message: [GenericMessage [payload=/local/MY_INPUT_FILE.DAT, headers={id=ba1ad258-72cf-ed07-1175-3d1cc36f9bc1, timestamp=1544122352595}]]
2018-12-06 13:52:32,599 INFO [task-scheduler-10] o.s.i.f.FileReadingMessageSource:380 - Created message: [GenericMessage [payload=/local/MY_INPUT_FILE.DAT, headers={id=ab8e9fbc-72a1-43e0-2ca3-8b8dcb3d91e5, timestamp=1544122352599}]]
如果您看到有两个以粗体标记的线程,它们拾取了相同的文件并触发了相同的作业两次。有人可以指导我如何避免这些情况吗?
最佳答案
看起来在下一个轮询周期中从 sourceFileDirectory
目录中选取了相同的文件。
您需要考虑将 AcceptOnceFileListFilter
与 RegexPatternFileListFilter
一起使用作为 CompositeFileListFilter
或 ChainFileListFilter
中的组合>:https://docs.spring.io/spring-integration/docs/current/reference/html/files.html#file-reading
关于java - 具有 FileReadingMessageSource 的 IntegrationFlows 对同一输入文件触发作业两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53671336/