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

Java 在第二个读卡器中使用第一个读卡器的输出,java,spring-batch,Java,Spring Batch,我正在使用读卡器获取上下文中存储的RequestDto: public类ItemReaderStoredData实现ItemReader{ private List requestListDto=新的ArrayList(); @先于 公共无效检索InterstepData(StepExecution StepExecution){ JobExecution JobExecution=stepExecution.getJobExecution(); ExecutionContext jobCont

我正在使用读卡器获取上下文中存储的
RequestDto

public类ItemReaderStoredData实现ItemReader{
private List requestListDto=新的ArrayList();
@先于
公共无效检索InterstepData(StepExecution StepExecution){
JobExecution JobExecution=stepExecution.getJobExecution();
ExecutionContext jobContext=jobExecution.getExecutionContext();
this.requestListDto=(List)jobContext.get(“directRequestListDto”);
}
@凌驾
public List read()引发异常、UnexpectedInputException、ParseException、NonTransientResourceException{
返回requestListDto;
}
}
我想通过调整
cursorItemReader
(在
stepConfig
中使用)来检查数据库中
RequestDto
列表的每个
uuid
是否存在。目的是将非冗余项写入文件中

@Bean
公共JdbcCursorItemReader cursorItemReader(){
JdbcCursorItemReader=新的JdbcCursorItemReader();
reader.setSql(“从选项卡中选择*);
reader.setDataSource(this.dataSource);
setRowMapper(新的TableMapperDto());
返回读取器;
}
如何在同一步骤中使用读卡器1在读卡器2中的输出?或者可以将两个代码合并到一个单独的类中吗


Edit:我正在考虑将两者合并:将
jdbcursoritemreader
itemreaderstoredata
@BeforeStep
放在一个单独的类中可以解决我的问题。但是我对
Datasource
Error
有问题,它是
Null
。以这种方式合并它们是否安全以及如何做到这一点?

不建议在执行上下文中存储项目列表,因为它会在块/步骤边界上持久化(这可能在性能方面代价高昂)

我想读取xlsx文件(输入),填充DTO,检查数据库中的redunduncy,过滤我的DTO列表,在文件1中写入新项(或数据库),并在文件2(输出)中记录冗余项

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

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

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

如何在同一步骤中使用读卡器二中的读卡器一的输出?
:面向块的步骤只有一个读卡器<代码>目的是将非冗余项写入文件。:您试图实现什么?您能在不参考spring批处理术语的情况下解释作业的输入/输出吗?您好,我想阅读xlsx文件(输入),填充DTO,检查数据库中的redunduncy,过滤我的DTO列表,在文件中写入新项(或数据库),并在文件中记录冗余项2'(输出)。感谢您的回复。不过我还是要读两种不同的资料。如果我想在一个步骤中完成所有这些,并且一个步骤只包含一个阅读器。第一个是读取xlsx。第二个是访问数据库。我应该在ItemProcessor中包含第二个项目吗?您只需要一个面向块的步骤:读取器读取xlsx文件,处理器向db查询以检查当前项目的存在(例如,它可以使用
jdbcTemplate
)和编写器(和/或侦听器,具体取决于方法)如果您不想从处理器发出一个查询并拥有一个等效的REST端点,那么可以用REST调用替换jdbcTemplate的使用。如果答案有帮助,请接受它。