当前位置: 首页 > 知识库问答 >
问题:

在创建spring批处理bean时得到“Scope'step'对于当前线程不是活动的”

满俊楠
2023-03-14

在我的Spring批处理配置中,我试图设置一个分区步骤,该步骤访问JobParameters中的值,如下所示:

@Bean
@Qualifier("partitionJob")
public Job partitionJob() throws Exception {

    return jobBuilderFactory
            .get("partitionJob")
            .incrementer(new RunIdIncrementer())
            .start(partitionStep(null))
            .build();
}

@Bean
@StepScope //I'm getting exception here - > Error creating bean 
public Step partitionStep(
        @Value("#{jobParameters[gridSize]}") String gridSize)
        throws Exception {

    return stepBuilderFactory
            .get("partitionStep")
            .partitioner("slaveStep", partitioner())
            .gridSize(
                    StringUtils.isEmpty(gridSize) ? 10 : Integer
                            .parseInt(gridSize))
            .step(slaveStep(50000))
            .taskExecutor(threadPoolTaskExecutor()).build();
}

@Bean
@StepScope
public Step slaveStep(int chunkSize) throws Exception {

    return stepBuilderFactory
            .get("slaveStep")
            .<Person,Person> chunk(chunkSize)
            .reader(jdbcPagingItemReader()),
            .writer(csvFileWriterParts())
            .listener(stepExecutionListener()).build();
}

我已经将@EnableBatchProcessing注释添加到我的SpringBoot应用程序中。

但是如果我在partitionStep上使用StepScope注释,我会得到

创建名为“ScopedTarget.PartitionStep”的bean时出错:当前线程的作用域“step”不活动;如果您打算从单例引用这个bean,请考虑为它定义一个有作用域的代理;嵌套异常是java.lang.IllegalStateException:没有可用于步骤范围的上下文保持器

但是如果我将它更改为JobScope,那么它将在slaveStep()处失败,并出现相同的错误消息。

在这种情况下使用的正确范围是什么?如何解决这个问题?

在配置spring Bean时访问JobParameters的更好方法是什么?

异常堆栈如下

如果我修改到JobScope,我在slaveStep上得到异常,它与上面的异常类似。

共有1个答案

唐烨煜
2023-03-14

使用Spring boot时请尝试选项Spring批处理范围问题,由Manh发布。我猜它解决了问题。不幸的是,我不再有权访问代码库,以确认我为修复做了什么。

 类似资料: