IntegrationFlows 与 FileReadingMessageSource 为同一输入文件触发作业两次 [英] IntegrationFlows with FileReadingMessageSource triggering job twice for same input file
问题描述
我有一个 Spring Integration Batch 作业,它在文件到达时被触发:
I have a Spring Integration Batch job which is triggerred when the files are arrived:
@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;
}
长期以来一直很顺利,但最近我遇到了同一输入文件的作业运行两次的问题.以下是日志文件的片段:
It has been pretty smooth for long but recently I faced issue where the jobs ran twice for the same input file. Following is a snippet from log files:
2018-12-06 13:52:32,595 INFO [task-scheduler-7] osifFileReadingMessageSource:380 - 创建的消息:[GenericMessage [payload=/local/MY_INPUT_FILE.DAT, headers={id=ba1ad258-72cf-ed07-1175-3d1cc36f9bc1,时间戳=1544122352595}]]
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] osifFileReadingMessageSource:380 - 创建的消息:[GenericMessage [payload=/local/MY_INPUT_FILE.DAT, headers={id=ab8e9fbc-72a1-43e0-2ca3-8b8dcb3d91e5,时间戳=1544122352599}]]
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}]]
如果您看到有两个以粗体标记的线程,它们拾取了相同的文件并两次触发了相同的作业.有人可以指导我如何避免这些情况吗?
If you see there are two threads marked in bold which have picked up the same files and triggered same job twice. Can someone please guide me how to avoid these cases?
推荐答案
看起来在下一个轮询周期从 sourceFileDirectory
目录中提取了同一个文件.
Looks like the same file is picked up from the sourceFileDirectory
directory on the next polling cycle.
您需要考虑将 AcceptOnceFileListFilter
与 RegexPatternFileListFilter
一起用作 CompositeFileListFilter
或 ChainFileListFilter
中的组合>:https://docs.spring.io/spring-integration/docs/current/reference/html/files.html#file-reading
You need to consider to use an AcceptOnceFileListFilter
alongside with that RegexPatternFileListFilter
as a composition in the CompositeFileListFilter
or ChainFileListFilter
: https://docs.spring.io/spring-integration/docs/current/reference/html/files.html#file-reading
这篇关于IntegrationFlows 与 FileReadingMessageSource 为同一输入文件触发作业两次的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!