我正在使用Spring批处理4并且有一个包含一个tasklet的4个步骤的作业定义。定义的作业范围bean很少。我的理解是作业范围的bean对于作业实例是唯一的。使用每次运行唯一的作业参数调用作业。
现在问题是在一个作业实例中创建的作业范围bean进入另一个作业实例。场景是第一个tasklet创建一个具有作业范围的bean,并且可以在另一个tasklet中访问它。当调用多个作业实例时,当作业实例-2的step2 tasklet访问作业范围的bean时,它将被注入由作业实例-1创建的bean。理想情况下,应该传递在作业实例-2中创建的bean。
工作定义:
<batch:job id="batchJob">
<batch:step id="step1">
<tasklet ref="tasklet1" />
<batch:next on="*" to="step2"/>
</batch:step>
<batch:step id="step2">
<tasklet ref="tasklet2" />
<batch:next on="*" to="step3"/>
</batch:step>
<batch:step id="step3">
<tasklet ref="tasklet3" />
<batch:next on="*" to="step4"/>
</batch:step>
<batch:step id="step4">
<tasklet ref="tasklet4" />
</batch:step>
</batch:job>
作业范围的bean定义:
<bean id="testVo" class="com.test.model.report.TestVo" scope="job"/>
<bean class="org.springframework.batch.core.scope.JobScope" />
作业启动作业参数:
JobParameters jobParameters =
new JobParametersBuilder()
.addLong("jobStartTime", System.currentTimeMillis())
.addLong("requestId", Long.valueOf(payload)).toJobParameters();
jobLauncher.run(batchJob, jobParameters);
示例Tasklet定义及其对作业范围bean的访问
@Component
public class Tasklet2 implements Tasklet {
/** The job scoped bean. */
@Autowired
private TestVo testVo;
....
}
上述配置中是否存在任何特定问题。为什么作业范围的bean会在作业实例中混合使用?