我创建了 fileAllocationTasklet,其目的是将文件从一个路径移动到另一个路径。该文件将输入作为 fromPath 和 To Path。所以我试图在两个步骤中使用这个相同的tasklet来制作新对象。我知道 tasklet 只运行一次。
@Bean
public Step step3() {
System.out.println("******step3 executing ");
return stepBuilderFactory.get("step3")
.tasklet(fileAllocationTasklet("process/data.csv","output/data.csv")).build();
}
@Bean
public Step step1(JdbcBatchItemWriter<TxnDetail> writer) {
return stepBuilderFactory.get("step1")
.tasklet(fileAllocationTasklet("initial/data.csv","process/data.csv")).build();
}
@Bean
public Tasklet fileAllocationTasklet(String fromPath,String toPath) {
FileAllocationTasklet fileAllocation = new FileAllocationTasklet();
fileAllocation.setFromPath(fromPath);
fileAllocation.setToPath(toPath);
return fileAllocation;
}
但是 tasklet 只在第 1 步中第一次运行,但在第 3 步中没有运行。我这样做是为了避免代码冗余。如果有其他最好的方法,那将是可观的。
实际上,我使用了@StepScope 的答案,这意味着每个步骤的对象都是唯一的,但不是单例的。每次执行步骤都会形成新的 tasklet 对象,该对象之前由于 @Bean 而没有形成。解释也可以在https://stackoverflow.com/questions/38780796/how-does-spring-batch-step-scope-work?utm_medium=organic&utm_source=google_rich_qa&utm_campaign=google_rich_qa