Spring 批处理和多重依赖 reader
Spring Batch and multiple dependent reader
我正在编写一个 Spring 批处理作业,但我找不到处理多个数据源并将其合并在一起的方法。
我有一个网站 api,其中 return 对象及其 ID 列表。
我还有一个包含其他一些对象的数据库
对于从网络读取的每个对象 api 调用,我需要向数据库发送一个 sql 请求以获取具有我当前对象 ID 的对象 i正在阅读。
然后我需要将这些对象合并在一起并将它们保存到另一个网站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();
}
那么,我该如何共享我从第一个 reader 到第二个 reader 的所有读取数据?
谢谢
Spring批量不允许一步使用多个reader
有不止一种方法可以解决您的问题:
- 在 reader 中查询网页 api。在处理器中,对从 reader 接收到的每个项目执行 sql 查询,并将组合传递给编写器(或下一个处理器)。
- 编写一个 reader 来查询网络 api 并直接为每个读取的项目执行 sql 查询。
- 使用两个步骤:首先,查询网络 api 并将结果写入暂存 table。然后,使用 reader 将数据库中的现有数据与来自 Web api.
的结果连接起来
我正在编写一个 Spring 批处理作业,但我找不到处理多个数据源并将其合并在一起的方法。
我有一个网站 api,其中 return 对象及其 ID 列表。
我还有一个包含其他一些对象的数据库
对于从网络读取的每个对象 api 调用,我需要向数据库发送一个 sql 请求以获取具有我当前对象 ID 的对象 i正在阅读。
然后我需要将这些对象合并在一起并将它们保存到另一个网站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();
}
那么,我该如何共享我从第一个 reader 到第二个 reader 的所有读取数据?
谢谢
Spring批量不允许一步使用多个reader
有不止一种方法可以解决您的问题:
- 在 reader 中查询网页 api。在处理器中,对从 reader 接收到的每个项目执行 sql 查询,并将组合传递给编写器(或下一个处理器)。
- 编写一个 reader 来查询网络 api 并直接为每个读取的项目执行 sql 查询。
- 使用两个步骤:首先,查询网络 api 并将结果写入暂存 table。然后,使用 reader 将数据库中的现有数据与来自 Web api. 的结果连接起来