Обзор кода:
У меня есть контроллер REST, который запускает пакетное задание с параметрами:
Код: Выделить всё
@RestController
@RequestMapping("/wso2-instances")
@RequiredArgsConstructor
@Slf4j
public class Wso2InstanceController {
private final JobOperator jobOperator;
private final Job wso2InstancesJob;
@Value("${batch.props.acash.instanceId}")
private String acashInstanceId;
@GetMapping("/acash/lunch")
public ResponseEntity acashBatchLunch() {
try {
JobParameters params = new JobParametersBuilder()
.addString("instanceId", acashInstanceId)
.addLong("time", System.currentTimeMillis())
.toJobParameters();
jobOperator.start(wso2InstancesJob, params); // Parameters passed here
return ResponseEntity.ok(DefaultResponse.builder().build());
} catch (Exception e) {
log.error(e.getMessage(), e);
return ResponseEntity.badRequest().build();
}
}
}
Код: Выделить всё
@Configuration
@RequiredArgsConstructor
@EnableBatchProcessing
public class BatchConfig {
private final Wso2InstanceItemReader wso2InstanceItemReader;
private final JobRepository jobRepository;
private final Wso2InstanceItemProcessor wso2InstanceItemProcessor;
private final Wso2InstanceItemWriter wso2InstanceItemWriter;
private final PlatformTransactionManager transactionManager;
@Bean
public Step wso2InstanceStep() {
return new StepBuilder("wso2-instances-step", jobRepository)
.chunk(100).transactionManager(transactionManager)
.reader(wso2InstanceItemReader)
.processor(wso2InstanceItemProcessor)
.writer(wso2InstanceItemWriter)
.build();
}
@Bean
public Job wso2InstanceJob() {
return new JobBuilder("wso2-instances-job", jobRepository)
.incrementer(new RunIdIncrementer())
.start(this.wso2InstanceStep()).build();
}
@Bean
public JobOperatorFactoryBean jobOperator() {
JobOperatorFactoryBean jobOperatorFactoryBean = new JobOperatorFactoryBean();
jobOperatorFactoryBean.setJobRepository(jobRepository);
return jobOperatorFactoryBean;
}
@Bean
@StepScope
public JobParams getInstanceId(@Value("#{jobParameters['instanceId']}") String instanceId) {
return JobParams.builder().instanceId(instanceId).build();
}
}
Код: Выделить всё
@Component
@RequiredArgsConstructor
@StepScope
@Slf4j
public class Wso2InstanceItemReader implements ItemReader {
private final Wso2InstanceDao wso2InstanceDao;
private Iterator iterator;
private final JobParams jobParams;
@Override
public @Nullable Wso2Instance read() {
if (iterator == null) {
log.info("{}", jobParams.getInstanceId());
List data = wso2InstanceDao.getWso2Instances(null);
iterator = data.iterator();
}
if (iterator.hasNext()) {
return iterator.next();
}
return null;
}
}
Код: Выделить всё
@Builder
@Data
public class JobParams {
String instanceId;
}
JobParams.getInstanceId() в средстве чтения всегда возвращает значение null, хотя я передаю параметр при запуске задания. Контроллер правильно получает значение из свойств (acashInstanceId), и я вижу, что задание успешно запускается.
Среда:
Код: Выделить всё
Spring Boot 3.x
Spring Batch 6.x
Java 17
Подробнее здесь: https://stackoverflow.com/questions/798 ... g-stepscop
Мобильная версия