这是在使用Spring Batch 3.0.8的情况下。我创建了一个作业,其中的某些步骤是使用由MultiResourceItemReader包装的Spring FlatFileItemReader从csv文件读取的。我想知道spring是否在读取文件后自动关闭输入流,还是我需要显式执行的操作?如果我需要关闭它,那么有关在哪里关闭它的一些建议是什么?
之所以这样问,是因为我们注意到MultiResourceItemReader在完成当前步骤并继续下一步时并没有关闭输入流,这对我们来说是个大问题,因为我们正在读取1000多个文件,并且将来会读更多。
答案 0 :(得分:1)
我想知道spring在读取文件后是否自动关闭输入流,还是我需要显式执行的操作?
是的,一旦完成该步骤,Spring Batch将自动关闭资源。您无需调用close
方法,因为这是面向块的步骤中阅读器生命周期的一部分。
答案 1 :(得分:0)
MultiResourceItemReader
委托,并且没有close
方法。 delegate
有一个close方法。当close
完成后,将调用委托人的Resource
方法。
所以;您可能必须在您的委托上实现close
方法,或者重写,才能在当前close
上调用resource
方法(在close
上调用resource
是刚刚完成的)),如果您的Resource
的实现具有close
方法。
我不认为应该使用Resource
。我认为它应该更多地是InputStream
或File
或类似产品的“供应商”。
因此,如果您愿意,我个人最喜欢的模式是在delegate
open
方法中为我分配的输入流字段,并询问当前的{{1 }}为resource
进行分配,然后在InputStream
方法中,我对已分配的输入流调用close
。
Spring Batch无法真正知道是否需要关闭close
中的InputStream
,以及何时关闭。
一些在实现中烘焙的方法可以这样工作,还有一些提供读者的第三方库。和我所有的读者。
对我来说,Resource
是供应商,在某些情况下,可能会被反复调用以每次都提供相同的或新的Resource
。
所以;在您使用InputStream
类的情况下:您可能必须关闭在委托阅读器中获得的所有输入流,请使用从MultiResourceItemReader
pre资源调用的委托阅读器的close
方法,并当Spring Batch在步骤结束时在MultiResourceItemReader
上调用close
时,将其作为最终方法一次