IntegrationFlows和FileReadingMessageSource为同一输入文件触发作业两次



我有一个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:32595 INFO[task-scheduler-7]o.s.i.f.FileReadingMessageSource:380-创建的消息:[GenericMessage[payload=/local/MY_INPUT_FILE.DAT,headers={id=ba1ad258-72cf-ed07-1175-3d1cc36f9bc1,timestamp=154112235259595}]]

2018-12-06 13:52:32599信息[task-schedler-10]o.s.i.f.FileReadingMessageSource:380-创建的消息:[GenericMessage[payload=/local/MY_INPUT_FILE.DAT,headers={id=ab8e9fbc-72a1-43e0-2ca3-8b8dcb3d91e5,timestamp=15414122352599}]]

如果您看到有两个用粗体标记的线程,它们已经拾取了相同的文件并触发了相同的作业两次。有人能告诉我如何避免这些情况吗?

在下一个轮询周期中,似乎从sourceFileDirectory目录中提取了相同的文件。

您需要考虑在CompositeFileListFilterChainFileListFilter中使用AcceptOnceFileListFilterRegexPatternFileListFilter作为合成:https://docs.spring.io/spring-integration/docs/current/reference/html/files.html#file-读取

最新更新