获得"范围'步骤'对于当前线程没有活动"在创建spring批量bean时

时间:2018-05-25 21:22:54

标签: spring spring-batch

在我的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应用程序中。

由于我想在构建步骤时访问JobParameters,我使用了@StepScope。我有一个工作正常的示例,没有@StepScope注释,但在这种情况下,我没有访问任何JobParameters或任何来自上下文。

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

  

使用name&#39; scopedTarget.partitionStep&#39;:Scope创建bean时出错   &#39;步骤&#39;当前线程不活动;考虑定义一个   如果你打算从a引用它,那么这个bean的scoped代理   单;嵌套异常是java.lang.IllegalStateException:否   上下文持有者可用于步骤范围

但如果我将其更改为JobScope,则它在slaveStep()失败时会显示相同的错误消息。

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

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

异常堆栈如下

  

2018-05-25 21:07:32,075错误[主要]   org.springframework.batch.core.job.AbstractJob:遇到了致命的问题   执行作业时出错   org.springframework.beans.factory.BeanCreationException:错误   创建名称为“scopedTarget.partitionStep&#39;:范围&#39;步骤&#39;是   对当前线程不活跃;考虑定义范围代理   对于这个bean,如果你打算从单身中引用它;嵌套   异常是java.lang.IllegalStateException:没有上下文持有者   可用于步骤范围   org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:361)     在   org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)     在   org.springframework.aop.target.SimpleBeanTargetSource.getTarget(SimpleBeanTargetSource.java:35)     在   org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:192)     在com.sun.proxy。$ Proxy55.getName(未知来源)at   org.springframework.batch.core.job.SimpleStepHandler.handleStep(SimpleStepHandler.java:115)     在   org.springframework.batch.core.job.AbstractJob.handleStep(AbstractJob.java:392)     在   org.springframework.batch.core.job.SimpleJob.doExecute(SimpleJob.java:135)     在   org.springframework.batch.core.job.AbstractJob.execute(AbstractJob.java:306)     在   org.springframework.batch.core.launch.support.SimpleJobLauncher $ 1.run(SimpleJobLauncher.java:135)     在   org.springframework.core.task.SyncTaskExecutor.execute(SyncTaskExecutor.java:50)     在   org.springframework.batch.core.launch.support.SimpleJobLauncher.run(SimpleJobLauncher.java:128)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at   sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)     在   sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)     在java.lang.reflect.Method.invoke(Method.java:498)at   org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)     在   org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)     在   org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)     在   org.springframework.batch.core.configuration.annotation.SimpleBatchConfiguration $ PassthruAdvice.invoke(SimpleBatchConfiguration.java:127)     在   org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)     在   org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)     在com.sun.proxy。$ Proxy54.run(未知来源)at   com.sample.main(ExtractApplication.java:58)   引起:java.lang.IllegalStateException:没有上下文持有者   可用于步骤范围   org.springframework.batch.core.scope.StepScope.getContext(StepScope.java:167)     在   org.springframework.batch.core.scope.StepScope.get(StepScope.java:99)     在   org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:346)     ...省略了23个常见帧

如果我修改为JobScope,我会在slaveStep上遇到异常,这与上述异常类似。

1 个答案:

答案 0 :(得分:1)

请尝试由Manh发布的选项Spring batch scope issue while using spring boot。我猜它解决了问题。不幸的是,我无法再访问代码库来确认所做的修复工作。