Пружинный пакет и многократный зависимый считыватель

#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.