Spring Boot Batch 6.x: параметры задания в Reader имеют значение null, несмотря на использование @StepScopeJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Spring Boot Batch 6.x: параметры задания в Reader имеют значение null, несмотря на использование @StepScope

Сообщение Anonymous »

Я пытаюсь передать параметры задания из контроллера REST в средство чтения пакетных заданий в Spring Boot Batch 6.x, но в средстве чтения параметры всегда имеют значение null. Я использую выражения @StepScope и SpEL, как рекомендовано в документации, но не могу заставить их работать.
Обзор кода:
У меня есть контроллер 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;
}
}
Класс JobParams:

Код: Выделить всё

@Builder
@Data
public class JobParams {
String instanceId;
}
Проблема:
JobParams.getInstanceId() в средстве чтения всегда возвращает значение null, хотя я передаю параметр при запуске задания. Контроллер правильно получает значение из свойств (acashInstanceId), и я вижу, что задание успешно запускается.
Среда:

Код: Выделить всё

Spring Boot 3.x

Spring Batch 6.x

Java 17
Документация по загрузке Spring

Подробнее здесь: https://stackoverflow.com/questions/798 ... g-stepscop
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»