Spring 批处理和多重依赖 reader

Spring Batch and multiple dependent reader

我正在编写一个 Spring 批处理作业,但我找不到处理多个数据源并将其合并在一起的方法。



    @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();
    }

那么,我该如何共享我从第一个 reader 到第二个 reader 的所有读取数据?

谢谢

Spring批量不允许一步使用多个reader

有不止一种方法可以解决您的问题:

  • 在 reader 中查询网页 api。在处理器中,对从 reader 接收到的每个项目执行 sql 查询,并将组合传递给编写器(或下一个处理器)。
  • 编写一个 reader 来查询网络 api 并直接为每个读取的项目执行 sql 查询。
  • 使用两个步骤:首先,查询网络 api 并将结果写入暂存 table。然后,使用 reader 将数据库中的现有数据与来自 Web api.
  • 的结果连接起来