我在用读卡器获取存储的 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
通过修改在数据库中列出 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
在一个单独的班级里 @BeforeStep
的 ItemReaderStoredData
会解决我的问题。但我不同意
Datasource Error
哪个是 Null
. 以这种方式合并它们安全吗?如何做到这一点?
1条答案
按热度按时间yfjy0ee71#
不建议将项目列表存储在执行上下文中,因为它是在块/步骤边界上持久化的(这可能在性能方面很昂贵)。
我想读取xlsx文件(输入),填充一个dto,在数据库中检查redunduncy,过滤我的dto列表,在file1中写入一个新项(或数据库),并在file2'(输出)中记录冗余项。
有几种方法可以实现这一点,而不必将项存储在列表中并通过执行上下文共享它们。以下是一些选项:
选项1:使用项目处理器筛选现有项目。可以使用
ItemProcessListener
. 处理器不会过滤不存在的项,可以使用步骤的项编写器将其写入数据库。选项2:与选项1相同,但带有
SkipListener
而不是ItemProcessListener
. 在这种情况下,处理器将为现有项抛出异常(应声明为可跳过),而不是返回null
对于现有项目(即过滤它们)。选项3:使用项目处理器检查并标记项目是否存在。一
ClassifierCompositeItemWriter
然后可以用于对项目进行分类并在适当的地方编写它们。还有其他技术,比如将文件加载到暂存表中并在两个表之间进行比较,但这些技术取决于用例(输入大小、比较逻辑等)。