Spring Batch 5:使用 TaskExecutor 时步骤被多次执行

问题描述 投票:0回答:1

我正在使用 Spring Batch 5.1.2 并遇到一个问题,即我的步骤被执行多次(正好 5 次),即使我只希望它执行一次。当我将 TaskExecutor 添加到步骤配置时,会发生这种情况。 这是我的步骤配置:

@Bean("dynamicStep0")
public Step dynamicStep0() {
    return new StepBuilder("step1Tasklet", jobRepository)
            .tasklet(new Step0Tasklet(), transactionManager)
            .taskExecutor(dynamicBatchStepExecutor())
            .build();
}

我的任务执行器配置:

@Bean("dynamicBatchStepTaskExecutor")
public ThreadPoolTaskExecutor dynamicBatchStepExecutor() {
    ThreadPoolTaskExecutor tpe = new ThreadPoolTaskExecutor();
    tpe.setCorePoolSize(1);
    tpe.setMaxPoolSize(1);
    tpe.setThreadNamePrefix("DynamicSteps-JOB-EXEC-");
    tpe.initialize();
    return tpe;
}

Tasklet 实现:

@RequiredArgsConstructor
    @Slf4j
    @StepScope
    public class Step0Tasklet implements Tasklet {
        @Override
        public RepeatStatus execute(StepContribution contribution, ChunkContext chunkContext) throws Exception {
            log.info("Step0Tasklet executed, this is a dummy step");
            return RepeatStatus.FINISHED;
        }
    }

输出日志当我运行作业时,我看到该步骤被执行了 5 次:

[INFO] SimpleJobLauncher [] - Job: [SimpleJob: [name=Dynamic job 2]] launched with the following parameters: [{'jobId':'{value=1736954208659, type=class java.lang.Long, identifying=true}'}]
[INFO] SimpleStepHandler [] - Executing step: [step1Tasklet]
[INFO] DynamicSteps-JOB-EXEC-1 Step0Tasklet [] - Step0Tasklet executed, this is a dummy step
[INFO] DynamicSteps-JOB-EXEC-1 Step0Tasklet [] - Step0Tasklet executed, this is a dummy step
[INFO] DynamicSteps-JOB-EXEC-1 Step0Tasklet [] - Step0Tasklet executed, this is a dummy step
[INFO] DynamicSteps-JOB-EXEC-1 Step0Tasklet [] - Step0Tasklet executed, this is a dummy step
[INFO] DynamicSteps-JOB-EXEC-1 Step0Tasklet [] - Step0Tasklet executed, this is a dummy step
  1. 我尝试将 ThreatLimit(1) 添加到步骤配置中,但它在 Spring Batch 5 中已弃用:
.taskExecutor(dynamicBatchStepExecutor())
.throttleLimit(1)
  1. 我尝试在 TaskExecutor 中设置队列容量:
tpe.setQueueCapacity(1);
  1. 如果我从步骤配置中删除 TaskExecutor,它可以正常工作(执行一次),但我需要 TaskExecutor 在日志中自定义线程命名。

问题

  • 为什么 Spring Batch 在使用 TaskExecutor 时执行该步骤 5 次,即使我已将 corePoolSize 和 maxPoolSize 设置为 1?
  • 如何确保该步骤仅执行一次,同时仍使用 TaskExecutor 进行自定义线程命名?

环境

  • 春季启动:3.2.1 春季批次:5.1.2 爪哇:17
spring-batch
1个回答
0
投票

任务执行器用于并行处理块,而不是一次性执行步骤 https://docs.spring.io/spring-batch/reference/scalability.html 如果删除它,它将执行一次。

© www.soinside.com 2019 - 2024. All rights reserved.