#java #spring-batch
Вопрос:
Я пишу пакетное задание Spring и не могу найти способ обработки нескольких источников данных, а затем объединить их вместе.
- У меня есть веб-api, который возвращает список объектов и их идентификатор.
- У меня также есть база данных с некоторыми другими объектами
- Для каждого объекта, считанного из вызова веб-api, мне нужно отправить sql-запрос в базу данных, чтобы получить объект с идентификатором моего текущего объекта, который я читаю.
- Затем мне нужно объединить эти объекты вместе и сохранить их в другом веб-api.
- У меня есть customHttpReader для вызова веб-api и получения списка данных.
- У меня есть JdbcCursorItemReader для отправки sql-запроса в базу данных.
@Bean
public Job todoJob() {
final String jobName = "todos-migration-job";
Step step1 = stepBuilderFactory.get("get-todo-from-api").<TodoDto, TodoDto>chunk(30)
.reader(todoItemReader)
.writer(todoItemWriter)
.build();
Step step2 =
stepBuilderFactory.get("get-todo-from-database").<TodoDto, TodoBackendDto>chunk(30)
.reader(todoItemReader)
.processor(todoItemDatabaseProcessor)
.writer(todoItemBackendWriter)
.build();
// what should I do here? should I do 1 or 2 steps?
Job todoJob = jobBuilderFactory.get(jobName)
.incrementer(new RunIdIncrementer())
.start(step1)
.next(step2)
.build();
this.jobService.registerJob(jobName);
return todoJob;
}
@Bean
public TodoItemRestReader todoItemReader() {
return new TodoItemRestReader();
}
@Bean
public JdbcCursorItemReader<TodoDto> todoItemDatabaseReader() {
return new JdbcCursorItemReaderBuilder<TodoDto>()
.dataSource(this.datasourceConfig.todoDataSource())
.name("todoItemDatabaseReader")
.sql("select id, title from todo_data where id = :id") // how do I get the id ?
.rowMapper(new TodoItemRowMapper())
.build();
}
Итак, как я могу поделиться всеми прочитанными данными с первого считывателя на второй ?
Спасибо
Ответ №1:
Весенняя партия не позволяет использовать более одного считывателя за один шаг.
Существует более одного способа решить вашу проблему:
- Запросите веб-api в программе чтения. В процессоре выполните sql-запрос для каждого элемента, полученного от считывателя, и передайте комбинацию записывающему устройству (или следующему процессору).
- Напишите одно средство чтения, которое запрашивает веб-api и напрямую выполняет sql-запрос для каждого прочитанного элемента.
- Выполните два шага: сначала запросите веб-api и запишите результаты в промежуточную таблицу. Затем используйте средство чтения, которое соединяет существующие данные в базе данных с результатами веб-api.