如何使用 Spring Batch Integration 使用多个实例同时处理多个大文件?

时间:2021-07-28 12:15:45

标签: spring-batch spring-integration spring-batch-integration

我创建了一个用于处理多个文件的 Spring Batch 集成项目,并且它的工作非常出色。

在我写这个问题时,我有 四个 Pod 正在运行,但行为并不像我期望的那样,我希望同时处理 20 个文件(每个 Pod 五个) .

我的池化器设置使用以下参数:

    poller-delay: 10000
    max-message-per-poll: 5

我也使用 Redis 来存储文件和过滤器:

    private CompositeFileListFilter<S3ObjectSummary> s3FileListFilter() {
        return new CompositeFileListFilter<S3ObjectSummary>().addFilter(
                new S3PersistentAcceptOnceFileListFilter(new RedisMetadataStore(redisConnectionFactory), "prefix-"))
                .addFilter(new S3RegexPatternFileListFilter(".*\\.csv$"));
    }

似乎每个 Pod 只处理一个文件,还有另一种奇怪的行为,比如其中一个 Pod 将所有文件注册到 Redis 中,因此其他 Pod 只能获取新文件。

最佳实践以及如何解决同时处理多个文件的问题?

1 个答案:

答案 0 :(得分:1)

S3InboundFileSynchronizingMessageSource 上查看此选项:

/**
 * Set the maximum number of objects the source should fetch if it is necessary to
 * fetch objects. Setting the
 * maxFetchSize to 0 disables remote fetching, a negative value indicates no limit.
 * @param maxFetchSize the max fetch size; a negative value means unlimited.
 */
@ManagedAttribute(description = "Maximum objects to fetch")
void setMaxFetchSize(int maxFetchSize);

这是文档:https://docs.spring.io/spring-integration/docs/current/reference/html/ftp.html#ftp-max-fetch