IntegrationFlows 与 FileReadingMessageSource 为同一输入文件触发作业两次 [英] IntegrationFlows with FileReadingMessageSource triggering job twice for same input file

查看:86
本文介绍了IntegrationFlows 与 FileReadingMessageSource 为同一输入文件触发作业两次的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个 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.

您需要考虑将 AcceptOnceFileListFilterRegexPatternFileListFilter 一起用作 CompositeFileListFilterChainFileListFilter 中的组合>: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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆