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

在创建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();
}

我已经向SpringBoot应用程序添加了@EnableBatchProcessing注释。

异常堆栈如下所示

2018-05-25 21:07:32,075 ERROR[main]org.springframework.batch.core.job.abstractJob:执行作业org.springframework.beans.factory.beanCreationException:创建名为“ScopedTarget.PartitionStep”的bean时出错:当前线程的Scope“step”不活动;如果您打算从单个对象引用这个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.simplebeanFactory.java:35)在sun.proxy.$proxy55.getName(来源未知)在org.springframework.batch.core.job.simpleStep(SimpleStephandler.java:115)在org.springframework.batch.core.job.abstractJob.handleStep(AbstractJob.java:392)在org.springframework.batch.core.job.simpleJob.doExecute(SimpleJob.java:135)在launcher.java:135)在org.springframework.core.task.synctaskExecutor.execute(SynctaskExecutor.java:50)在org.springframework.batch.core.support.simpleJobLauncher.run(SimpleJobLauncher.java:128)在sun.reflect.nativeMethodAccessorImpl.invoke0(原生方法)在sun.reflect.nativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)在utils.invokeJoinpointusingReflection(aoputils.java:333)在org.springframework.aop.framework.reflectiveMethodInvocation.invokeJoinpoint(reflectiveMethodInvocation.java:190)在org.springframework.aop.framework.reflectiveMethodInvocation.proce(reflectiveMethodInvocation.java:157)在nvocation.java:179)在org.springframework.aop.framework.jdkdynamicaopproxy.invoke(jdkdynamicaopproxy.java:213)在com.sun.proxy.$proxy54.run(来源未知)在com.sample.main(extractapplication.java:58)由:java.lang.IllegalStateException引起:在org.springframework.batch.core.ccope.stepscope.getContext(dogetBean(abstractBeanFactory.java:346)...23个公共框架被省略

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

共有1个答案

施飞昂
2023-03-14

请在使用Spring boot时尝试选项Spring batch scope issue,由Manh发布。我想它解决了问题。不幸的是,我不再能够访问代码库,以确认我为修复做了什么。

 类似资料:
  • 在我的Spring批处理配置中,我试图设置一个分区步骤,该步骤访问JobParameters中的值,如下所示: 我已经将@EnableBatchProcessing注释添加到我的SpringBoot应用程序中。 但是如果我在partitionStep上使用StepScope注释,我会得到 创建名为“ScopedTarget.PartitionStep”的bean时出错:当前线程的作用域“step”

  • 如果BATCH_JOB_EXECUTION_CONTEXT没有创建,我得到的结果是: 由:org.springframework.jdbc.badsqlgrammareXception:PreparedStatementCallback;错误的SQL语法[插入BATCH_JOB_EXECUTION_CONTEXT(SHORT_CONTEXT,SERIALIZED_CONTEXT,JOB_EXECU

  • null 我更新了我的步骤并添加了一个ThreadPoolTaskExecutor,如下所示 在此之后,我的处理器将被多个线程调用,但使用相同的源数据。我还有什么需要做的吗?

  • 反正可以禁用SQL,我只是想测试我的读写器和处理器工作正常。

  • 我正在尝试使用多个处理器类在处理器步骤中处理记录。这些类可以并行工作。目前我已经编写了一个多线程步骤,其中我 设置处理器类的输入和输出行 提交给遗嘱执行人服务 获取所有未来对象并收集最终输出

  • 问题内容: 情况: 活动绑定到已启动的前台服务。 服务将本地活页夹分发给活动。 活动通过getService()调用获取对服务的引用。 活动希望使用消息 直接 与服务中运行的线程进行通信。它从活动中调用mService.getThreadHandler()方法。 问题: 如何从当前正在运行的线程中将Handler放入活动活动中,以便可以将消息直接发布到线程的messagequeue中? 我不需要在