Программисты JAVA общаются здесь
Anonymous
Spring Batch задание работает нормально только в первый раз. После этого не работает
Сообщение
Anonymous » 30 дек 2024, 12:39
Я запускаю пакетное задание с помощью API. В первый раз, когда я запускаю API после каждого перезапуска сервера, все работает нормально. Проходит все точки останова и сохраняет данные в БД как положено. Однако после этого в журнале написано, что задание запущено и шаг выполняется. Но он не достигает каких-либо точек останова, и данные также не сохраняются должным образом. Мой код и конфигурация следующие:
Код: Выделить всё
// Controller
@RestController
@Component
public class MyController {
@Autowired
JobLauncher jobLauncher;
@Autowired
Job insertJob;
@PostMapping("/start")
public String startBatchJob(@RequestParam String validation) {
try {
String jobId = String.valueOf(System.currentTimeMillis());
JobParameters jobParameters = new JobParametersBuilder()
.addString("jobId", jobId)
.addString("validation", validation)
.toJobParameters();
JobExecution jobExecution = jobLauncher.run(insertJob, jobParameters);
if (jobExecution.getStatus().isUnsuccessful() || jobExecution.getStatus() == BatchStatus.FAILED)
return "Job FAILED with Job ID: " + jobId + ". Status: " + jobExecution.getStatus();
// Get job status or other details
return "Job finished successfully with Job ID: " + jobId + ". Status: " + jobExecution.getStatus();
} catch (JobExecutionException e) {
e.printStackTrace();
return "Error starting job: " + e.getMessage();
}
}
}
// Batch Config
@Configuration
public class SpringBatchConfig {
@Autowired
ScheduledTasks scheduledTasks;
@Autowired
ValidationRepository validationRepository;
@Autowired
@Lazy
PlatformTransactionManager transactionManager;
@Autowired
@Lazy
JobRepository jobRepository;
public List
getData() {
return scheduledTasks.callRestApiForData();
}
@Bean(name = "insertJob")
public Job insertJob(BaseWriter writer,
BaseProcessor processor,
BaseReader reader) {
return new JobBuilder("insertJob", jobRepository)
.incrementer(new RunIdIncrementer())
.listener(insertJobListener()).start(step_1(writer, processor, reader)).build();
}
@Bean
public Step step_1(BaseWriter writer,
BaseProcessor processor,
BaseReader itemReader) {
return new StepBuilder("step_1", jobRepository)
. chunk(200, transactionManager)
.reader(itemReader)
.processor(processor)
.writer(writer)
.build();
}
@Bean
public JobExecutionListener insertJobListener() {
return new InsertJobCompletionListener();
}
}
// listener
@Slf4j
public class InsertJobCompletionListener extends JobExecutionListenerSupport {
@Override
public void afterJob(JobExecution jobExecution) {
if (jobExecution.getStatus() == BatchStatus.COMPLETED) {
log.info("UPDATE BATCH COMPLETED");
}
else if(jobExecution.getStatus() == BatchStatus.FAILED){
log.info("UPDATE BATCH JOB FAILED TO COMPLETE");
}
}
}
// reader
public interface BaseReader extends ItemReader {
}
@Configuration
public class ExchangeRateBaseReader implements BaseReader {
@Autowired
ScheduledTasks scheduledTasks;
private boolean read = false;
private List data;
private int index = 0;
@Override
public Personality read() throws Exception {
if (data == null) {
data = getData();
}
Personality item = null;
if (index < data.size()) {
item = data.get(index);
index++;
}
return item;
}
public List getData() {
return scheduledTasks.callRestApiForData();
}
}
// processor
public interface BaseProcessor extends ItemProcessor {
}
@Configuration
@Slf4j
public class CurrencyExchangeProcessor implements BaseProcessor {
@Override
public Personality process(Personality Personality) throws Exception {
return Personality;
}
}
// writer
public interface BaseWriter extends ItemWriter {
}
@Configuration
@Slf4j
public class CurrencyExchangeWriter implements BaseWriter {
@Autowired
private ValidationRepository validationRepository;
@Override
public void write(Chunk
Подробнее здесь: [url]https://stackoverflow.com/questions/79317222/spring-batch-job-runs-fine-only-the-first-time-doesnt-work-after-that[/url]
1735551565
Anonymous
Я запускаю пакетное задание с помощью API. В первый раз, когда я запускаю API после каждого перезапуска сервера, все работает нормально. Проходит все точки останова и сохраняет данные в БД как положено. Однако после этого в журнале написано, что задание запущено и шаг выполняется. Но он не достигает каких-либо точек останова, и данные также не сохраняются должным образом. Мой код и конфигурация следующие: [code]// Controller @RestController @Component public class MyController { @Autowired JobLauncher jobLauncher; @Autowired Job insertJob; @PostMapping("/start") public String startBatchJob(@RequestParam String validation) { try { String jobId = String.valueOf(System.currentTimeMillis()); JobParameters jobParameters = new JobParametersBuilder() .addString("jobId", jobId) .addString("validation", validation) .toJobParameters(); JobExecution jobExecution = jobLauncher.run(insertJob, jobParameters); if (jobExecution.getStatus().isUnsuccessful() || jobExecution.getStatus() == BatchStatus.FAILED) return "Job FAILED with Job ID: " + jobId + ". Status: " + jobExecution.getStatus(); // Get job status or other details return "Job finished successfully with Job ID: " + jobId + ". Status: " + jobExecution.getStatus(); } catch (JobExecutionException e) { e.printStackTrace(); return "Error starting job: " + e.getMessage(); } } } // Batch Config @Configuration public class SpringBatchConfig { @Autowired ScheduledTasks scheduledTasks; @Autowired ValidationRepository validationRepository; @Autowired @Lazy PlatformTransactionManager transactionManager; @Autowired @Lazy JobRepository jobRepository; public List getData() { return scheduledTasks.callRestApiForData(); } @Bean(name = "insertJob") public Job insertJob(BaseWriter writer, BaseProcessor processor, BaseReader reader) { return new JobBuilder("insertJob", jobRepository) .incrementer(new RunIdIncrementer()) .listener(insertJobListener()).start(step_1(writer, processor, reader)).build(); } @Bean public Step step_1(BaseWriter writer, BaseProcessor processor, BaseReader itemReader) { return new StepBuilder("step_1", jobRepository) . chunk(200, transactionManager) .reader(itemReader) .processor(processor) .writer(writer) .build(); } @Bean public JobExecutionListener insertJobListener() { return new InsertJobCompletionListener(); } } // listener @Slf4j public class InsertJobCompletionListener extends JobExecutionListenerSupport { @Override public void afterJob(JobExecution jobExecution) { if (jobExecution.getStatus() == BatchStatus.COMPLETED) { log.info("UPDATE BATCH COMPLETED"); } else if(jobExecution.getStatus() == BatchStatus.FAILED){ log.info("UPDATE BATCH JOB FAILED TO COMPLETE"); } } } // reader public interface BaseReader extends ItemReader { } @Configuration public class ExchangeRateBaseReader implements BaseReader { @Autowired ScheduledTasks scheduledTasks; private boolean read = false; private List data; private int index = 0; @Override public Personality read() throws Exception { if (data == null) { data = getData(); } Personality item = null; if (index < data.size()) { item = data.get(index); index++; } return item; } public List getData() { return scheduledTasks.callRestApiForData(); } } // processor public interface BaseProcessor extends ItemProcessor { } @Configuration @Slf4j public class CurrencyExchangeProcessor implements BaseProcessor { @Override public Personality process(Personality Personality) throws Exception { return Personality; } } // writer public interface BaseWriter extends ItemWriter { } @Configuration @Slf4j public class CurrencyExchangeWriter implements BaseWriter { @Autowired private ValidationRepository validationRepository; @Override public void write(Chunk Подробнее здесь: [url]https://stackoverflow.com/questions/79317222/spring-batch-job-runs-fine-only-the-first-time-doesnt-work-after-that[/url]