java—在第二个读卡器中使用第一个读卡器的输出

0yycz8jy  于 2021-07-06  发布在  Java
关注(0)|答案(1)|浏览(348)

我在用读卡器获取存储的 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;
    }
}

我要检查每个 uuidRequestDto 通过修改在数据库中列出 cursorItemReader ,用于 stepConfig . 目的是将非冗余项写入文件。

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

如何在同一步骤中使用读卡器2中读卡器1的输出?或者可以将两个代码合并到一个单独的类中?
编辑:我正在考虑合并这两个:放 JdbcCursorItemReader 在一个单独的班级里 @BeforeStepItemReaderStoredData 会解决我的问题。但我不同意
Datasource Error 哪个是 Null . 以这种方式合并它们安全吗?如何做到这一点?

yfjy0ee7

yfjy0ee71#

不建议将项目列表存储在执行上下文中,因为它是在块/步骤边界上持久化的(这可能在性能方面很昂贵)。
我想读取xlsx文件(输入),填充一个dto,在数据库中检查redunduncy,过滤我的dto列表,在file1中写入一个新项(或数据库),并在file2'(输出)中记录冗余项。
有几种方法可以实现这一点,而不必将项存储在列表中并通过执行上下文共享它们。以下是一些选项:
选项1:使用项目处理器筛选现有项目。可以使用 ItemProcessListener . 处理器不会过滤不存在的项,可以使用步骤的项编写器将其写入数据库。
选项2:与选项1相同,但带有 SkipListener 而不是 ItemProcessListener . 在这种情况下,处理器将为现有项抛出异常(应声明为可跳过),而不是返回 null 对于现有项目(即过滤它们)。
选项3:使用项目处理器检查并标记项目是否存在。一 ClassifierCompositeItemWriter 然后可以用于对项目进行分类并在适当的地方编写它们。
还有其他技术,比如将文件加载到暂存表中并在两个表之间进行比较,但这些技术取决于用例(输入大小、比较逻辑等)。

相关问题