首页 > 解决方案 > 在第二个阅读器中使用第一个阅读器的输出

问题描述

我正在使用阅读器将 a 存储RequestDto在上下文中:

public class ItemReaderStoredData implements ItemReader<List<RequestDto>> {
    private List<RequestDto> requestListDto = new ArrayList<>();
 
    @BeforeStep
    public void retrieveInterStepData(StepExecution stepExecution) {
        JobExecution jobExecution = stepExecution.getJobExecution();
        ExecutionContext jobContext = jobExecution.getExecutionContext();
        this.requestListDto = (List<RequestDto>)jobContext.get("directRequestListDto");
    }
    
    @Override
    public List<RequestDto> read() throws Exception, UnexpectedInputException, ParseException, NonTransientResourceException {
        return requestListDto;
    }
}

uuid我想通过调整来检查数据库中RequestDto列表中的每一个是否存在,cursorItemReaderstepConfig. 目的是将非冗余项写入文件。

@Bean
public JdbcCursorItemReader<HistoricDto> cursorItemReader() {
    JdbcCursorItemReader<HistoricDto> reader = new JdbcCursorItemReader();
    reader.setSql("select * from tab");
    reader.setDataSource(this.dataSource);
    reader.setRowMapper(new TableMapperDto());
    return reader;
}

如何在同一步骤中在阅读器二中使用阅读器一的输出?或者是否可以将两个代码合并到一个单独的类中?

编辑:我正在考虑将两者合并:将其放入JdbcCursorItemReader一个单独的类@BeforeStepItemReaderStoredData可以解决我的问题。但我有问题Datasource Errorwhich is Null。以这种方式合并它们是否安全以及如何做到这一点?

标签: javaspring-batch

解决方案


不建议在执行上下文中存储项目列表,因为它在块/步骤边界处持久保存(这在性能方面可能很昂贵)。

我想读取 xlsx 文件(输入),填充 DTO,检查数据库中的冗余,过滤我的 DTO 列表,写入 aa file1 新项目(或数据库)并将冗余项目记录在 file2'(输出)中。

有几种方法可以实现这一点,而不必将项目存储在列表中并通过执行上下文共享它们。这里有几个选项:

  • 选项 1:使用项目处理器过滤掉现有项目。现有项目可以使用ItemProcessListener. 不存在的项目不会被处理器过滤,并且可以使用步骤的项目编写器写入数据库。
  • 选项 2:与选项 1 相同,但使用 aSkipListener而不是 a ItemProcessListener。在这种情况下,处理器会为现有项目(应声明为可跳过)抛出异常,而不是null为现有项目返回(即过滤它们)。
  • 选项 3:使用项目处理器进行检查并将项目标记为存在与否。ClassifierCompositeItemWriter然后可以使用A对项目进行分类并在适当的地方编写它们。

还有其他技术,例如将文件加载到临时表中并在两个表之间进行比较,但这些技术取决于用例(输入大小、比较逻辑等)。


推荐阅读