filename
여러 파일을 동시에 가져 오기 위해 다른 매개 변수로 동일한 작업 구성을 여러 번 시작하고 싶습니다 (각 작업 하나의 파일).
@Configuration
public class MyJob {
//the steps contain each a reader, processor and writer
//reader is @JobScope
@Bean
public Job job(Step someStep, Step, someMoreStep) {
System.out.println("registering job bean");
return jobBuilderFactory.get(name)
.start(someStep)
.next(someMoreStep)
.build();
}
}
@Component
public class MyImporter {
@Autowired
private JobRegistry jobRegistry;
@Autowired
private JobLauncher launcher;
private static final String FILENAME = "baseFilename";
@Async
public void run(String i) {
p = new JobParametersBuilder();
p.addDate("date", new Date());
p.addString("filename", FILENAME + i + ".csv"); //injected via @Value jobParameter to job
Job job = jobRegistry.getJob("getMyJob");
launcher.run(job, p.toJobParameters());
}
}
@Component
public class MyImportManager {
@Autowired
private MyImporter importer;
//starts a job multiple times with different "filename" parameters,
//to simulate concurrent file imports with the same configuration job class
public void start() {
for (int i = 0; i < 4; i++) {
importer.run(i);
}
}
}
@SpringBootApplication
@EnableBatchProcessing(modular = true)
@EnableAsync
public class MyConfig {
}
문제 : 여러 작업을 시작할 수 있지만 같은 작업을 사용하는 것 같습니다 reader
. 단일 작업을 실행하면 i < 1
모든 것이 잘 작동합니다. 을 늘리면 i
이상한 입력이 나타납니다.
각 값을 한 줄씩 읽는 FlatFileItemReader를 사용하고 있습니다. 그러나 (다른 파일에서) 동시 가져 오기를 사용할 때 입력 문자열이 종종 손상됩니다.
그래서 동시 가져 오기를 위해 작업을 올바르게 등록하지 않는다고 가정합니까? 그런데 왜?
흥미로운 점 : 라인 "registering job bean"
은 한 번만 인쇄됩니다. 그러나 비동기 작업이 시작되는만큼 자주 인쇄되지 않아야합니까?
FlatFileItemReader
스레드로부터 안전하지 않으므로 리더 빈은 "작업"범위에 있어야합니다. 그러면 작업 당 하나의 인스턴스가 생성됩니다.
@Bean
@JobScope
public FlatFileItemReader<?> yourReaderBean(
@Value("#{jobParameters[filename]}") String filename){
FlatFileItemReader<?> itemReader = new FlatFileItemReader<?>();
itemReader.setLineMapper(lineMapper());
itemReader.setResource(new ClassPathResource(filename));
return itemReader;
}
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다