我创建了fileAllocationTasklet,其目的是将文件从一个路径移动到另一个路径。此文件将输入作为 fromPath 和 To Path。所以我正在尝试在制作新对象的两步中使用相同的小任务。我知道任务只运行一次。
@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的答案,这意味着该对象对于每个步骤都是唯一的,但不是单例的。每个步骤执行时,它将形成由于@Bean而以前未形成的tasklet的新对象。解释也有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
我不确定您要实现的目标。我在这里放置代码以确保我们在同一页面上理解。抱歉,我没有注释的示例项目,所以这里是 XML 配置。
作业配置
<job id="exampleJobTask" xmlns="http://www.springframework.org/schema/batch">
<step id="stepOne" next="stepTwo">
<tasklet ref="performTaskTaskOne"/>
</step>
<step id="stepTwo">
<tasklet ref="performTaskTaskTwo"/>
</step>
</job>
Bean 配置
<bean id="performTaskTaskOne" class="com.itservicesdepot.example.springbatch.tasklet.PerformTask" scope="step">
<property name="from" value="initial/data.csv" />
<property name="to" value="process/data.csv" />
</bean>
<bean id="performTaskTaskTwo" class="com.itservicesdepot.example.springbatch.tasklet.PerformTask" scope="step">
<property name="from" value="process/data.csv" />
<property name="to" value="output/data.csv" />
</bean>
测试类
package com.itservicesdepot.example.springbatch;
import java.util.Date;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.batch.core.ExitStatus;
import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobExecution;
import org.springframework.batch.core.JobParametersBuilder;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.util.StopWatch;
import junit.framework.Assert;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations={"classpath:example-jobs.xml"})
public class ShowCaseTest {
@Autowired
private JobLauncher jobLauncher;
@Autowired
@Qualifier(value = "exampleJobTask")
private Job exampleJobTask;
@Test
public void exampleJobTask() throws Exception {
StopWatch stopWatch = new StopWatch();
stopWatch.start();
JobExecution jobExecution = jobLauncher.run(this.exampleJobTask,
new JobParametersBuilder()
.addDate("now", new Date()).toJobParameters());
stopWatch.stop();
Assert.assertEquals(ExitStatus.COMPLETED, jobExecution.getExitStatus());
}
}
请查看并让我知道您想要实现的目标。
谢谢