春季何时关闭输入流?

时间:2018-08-09 15:34:36

标签: spring-batch

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

之所以这样问,是因为我们注意到MultiResourceItemReader在完成当前步骤并继续下一步时并没有关闭输入流,这对我们来说是个大问题,因为我们正在读取1000多个文件,并且将来会读更多。

2 个答案:

答案 0 :(得分:1)

  

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

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

答案 1 :(得分:0)

MultiResourceItemReader委托,并且没有close方法。 delegate有一个close方法。当close完成后,将调用委托人的Resource方法。

所以;您可能必须在您的委托上实现close方法,或者重写,才能在当前close上调用resource方法(在close上调用resource是刚刚完成的)),如果您的Resource的实现具有close方法。

我不认为应该使用Resource。我认为它应该更多地是InputStreamFile或类似产品的“供应商”。

因此,如果您愿意,我个人最喜欢的模式是在delegate open方法中为我分配的输入流字段,并询问当前的{{1 }}为resource进行分配,然后在InputStream方法中,我对已分配的输入流调用close

Spring Batch无法真正知道是否需要关闭close中的InputStream,以及何时关闭。

一些在实现中烘焙的方法可以这样工作,还有一些提供读者的第三方库。和我所有的读者。 对我来说,Resource是供应商,在某些情况下,可能会被反复调用以每次都提供相同的或新的Resource

所以;在您使用InputStream类的情况下:您可能必须关闭在委托阅读器中获得的所有输入流,请使用从MultiResourceItemReader pre资源调用的委托阅读器的close方法,并当Spring Batch在步骤结束时在MultiResourceItemReader上调用close时,将其作为最终方法一次