Spring batch spring批处理何时关闭输入流?

Spring batch spring批处理何时关闭输入流?,spring-batch,Spring Batch,这是在使用spring batch 3.0.8的背景下进行的。我创建了一个作业,其中一些步骤是使用SpringFlatFileItemReader从csv文件中读取,该文件由MultiResourceItemReader包装。我想知道spring是否在中读取文件后自动关闭输入流,或者这是我需要显式执行的操作?如果我需要关闭它,那么在哪里关闭它有什么建议 我问这个问题的原因是,我们注意到MultiResourceItemReader在完成当前步骤并进入下一步时没有关闭输入流,这对我们来说是一个大问

这是在使用spring batch 3.0.8的背景下进行的。我创建了一个作业,其中一些步骤是使用SpringFlatFileItemReader从csv文件中读取,该文件由MultiResourceItemReader包装。我想知道spring是否在中读取文件后自动关闭输入流,或者这是我需要显式执行的操作?如果我需要关闭它,那么在哪里关闭它有什么建议

我问这个问题的原因是,我们注意到MultiResourceItemReader在完成当前步骤并进入下一步时没有关闭输入流,这对我们来说是一个大问题,因为我们正在读取1000多个文件,将来还会读取更多

我想知道spring是否在中读取文件后自动关闭输入流,或者这是我需要显式执行的操作


是的,Spring Batch将在步骤完成后自动关闭资源。您不需要调用
close
方法,因为这是面向块的步骤中读取器生命周期的一部分。

MultiResourceItemReader
委托,并且没有
close
方法。
委托有一个close方法。完成
资源
时,将调用代理的
关闭
方法

所以,;如果
资源
的实现具有
关闭
方法,则您可能必须在代理上实现
关闭
方法,或者重写,以调用当前
资源
上的
关闭
方法(在
关闭
上调用刚刚完成的
资源
方法)

我不认为这就是
资源
的用途。我认为它更像是
输入流
文件
或类似文件的“供应商”

因此,如果您愿意,我个人最喜欢的模式是,我在
委托
打开
方法中为输入流分配了一个字段,它向当前
资源
请求
输入流
并分配,然后在
关闭
方法中,我对分配的输入流调用
close

Spring批处理无法真正知道是否需要关闭来自
资源的
InputStream
,以及何时关闭

有些插件实现是这样工作的,有些第三方库提供读者。还有我所有的读者。 对我来说,
资源
是一个供应商,它可以(在某些情况下)被反复调用,每次提供相同的或新的
输入流

所以,;在您使用
MultiResourceItemReader
类的情况下:您可能必须关闭在代理读取器中获得的任何输入流,在代理读取器的
close
方法中,该方法从
MultiResourceItemReader
pre-resource调用,并且在步骤结束时,当Spring批处理在
MultiResourceItemReader
上调用
close
时作为最终方法调用