我尝试使用JobStep
s(在此处推荐:How to run spring batch jobs in parallel)尝试在SpringBatch中链接作业。
@Configuration
public class JobFlowConfiguration {
@Bean
public Step jobStep1(StepBuilderFactory stepBuilderFactory, Job job1) {
return stepBuilderFactory.get("jobStep1").job(job1).build();
}
@Bean
public Step jobStep2(StepBuilderFactory stepBuilderFactory, Job job2) {
return stepBuilderFactory.get("jobStep2").job(job2).build();
}
@Bean
public Job flowJob(JobBuilderFactory jobBuilderFactory, Step jobStep1, Step jobStep2) {
return jobBuilderFactory.get("flowJob").incrementer(new RunIdIncrementer()).flow(jobStep1).next(jobStep2).end().build();
}
}
我面临的问题是,当加载具有此作业定义的配置时,我得到了
Caused by: org.springframework.beans.factory.BeanCurrentlyInCreationException: Error creating bean with name 'job1': Requested bean is currently in creation: Is there an unresolvable circular reference?
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.beforeSingletonCreation(DefaultSingletonBeanRegistry.java:347)
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:223)
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:298)
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:193)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.findAutowireCandidates(DefaultListableBeanFactory.java:1127)
at org.springframework.beans.factory.support.DefaultListableBeanFactory.doResolveDependency(DefaultListableBeanFactory.java:1051)
如果没有这个配置,所有引用的作业都可以正常工作,并且应用程序(运行SpringBoot的SpringBatch Admin)加载时没有任何问题。
我确定这些配置之间没有循环引用。对我来说,看起来首先所有Step
在任何Job
之前被加载但是它失败了,因为有一个Step
(jobStep1)取决于Job
(job1 )。
我还绑定从组件扫描中排除此配置类,然后在组件扫描后显式加载它。
任何想法我做错了什么?
更新
这是一个具有确切问题{{3}}的示例应用程序(使用正确的分支:jobstep_example
)
导致问题的类/配置是ImportUserFlowJobConfiguration
要启动SpringBatchAdmin
以查看问题。
更新:创建的作业如下:
@Bean
public Job job1(JobBuilderFactory jobs, Step s1) {
return jobs.get("job1").incrementer(new RunIdIncrementer()).flow(s1).end().build();
}