org.springframework.batch.item.file

## Class MultiResourceItemReader<T>

- java.lang.Object
- - org.springframework.batch.item.ItemStreamSupport
  - - org.springframework.batch.item.support.AbstractItemStreamItemReader<T>
    - - org.springframework.batch.item.file.MultiResourceItemReader<T>

- All Implemented Interfaces:
    ItemReader<T>, ItemStream, ItemStreamReader<T>

      public class MultiResourceItemReader<T>
      extends AbstractItemStreamItemReader<T>

  Reads items from multiple resources sequentially - resource list is given by `setResources(Resource[])`, the actual reading is delegated to `setDelegate(ResourceAwareItemReaderItemStream)`. Input resources are ordered using `setComparator(Comparator)` to make sure resource ordering is preserved between job runs in restart scenario.
  Author:
    Robert Kasanicky, Lucas Ward, Mahmoud Ben Hassine

- - ### Constructor Summary

    Constructors
    Constructor and Description
    `MultiResourceItemReader()`

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `close()` Close the `setDelegate(ResourceAwareItemReaderItemStream)` reader and reset instance variable values.
    `org.springframework.core.io.Resource` | `getCurrentResource()` Getter for the current resource.
    `void` | `open(ExecutionContext executionContext)` Figure out which resource to start with in case of restart, open the delegate and restore delegate's position in the resource.
    `T` | `read()` Reads the next item, jumping to next resource if necessary.
    `void` | `setComparator(java.util.Comparator<org.springframework.core.io.Resource> comparator)`
    `void` | `setDelegate(ResourceAwareItemReaderItemStream<? extends T> delegate)`
    `void` | `setResources(org.springframework.core.io.Resource[] resources)`
    `void` | `setSaveState(boolean saveState)` Set the boolean indicating whether or not state should be saved in the provided `ExecutionContext` during the `ItemStream` call to update.
    `void` | `setStrict(boolean strict)` In strict mode the reader will throw an exception on `open(org.springframework.batch.item.ExecutionContext)` if there are no resources to read.
    `void` | `update(ExecutionContext executionContext)` Store the current resource index and position in the resource.

    - ### Methods inherited from class org.springframework.batch.item.ItemStreamSupport

      `getExecutionContextKey, setExecutionContextName, setName`

    - ### Methods inherited from class java.lang.Object

      `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- - ### Constructor Detail

    - #### MultiResourceItemReader

          public MultiResourceItemReader()

  - ### Method Detail

    - #### setStrict

          public void setStrict(boolean strict)

      In strict mode the reader will throw an exception on `open(org.springframework.batch.item.ExecutionContext)` if there are no resources to read.
      Parameters:
        `strict` - false by default

    - #### read

          @Nullable
          public T read()
                           throws java.lang.Exception,
                                  UnexpectedInputException,
                                  ParseException

      Reads the next item, jumping to next resource if necessary.
      Returns:
        T the item to be processed or `null` if the data source is exhausted
      Throws:
        `ParseException` - if there is a problem parsing the current record (but the next one may still be valid)
        `NonTransientResourceException` - if there is a fatal exception in the underlying resource. After throwing this exception implementations should endeavour to return null from subsequent calls to read.
        `UnexpectedInputException` - if there is an uncategorised problem with the input data. Assume potentially transient, so subsequent calls to read might succeed.
        `java.lang.Exception` - if an there is a non-specific error.

    - #### close

          public void close()
                     throws ItemStreamException

      Close the `setDelegate(ResourceAwareItemReaderItemStream)` reader and reset instance variable values.
      Specified by:
        `close` in interface `ItemStream`
      Overrides:
        `close` in class `ItemStreamSupport`
      Throws:
        `ItemStreamException`
      See Also:
        `ItemStream.close()`

    - #### open

          public void open(ExecutionContext executionContext)
                    throws ItemStreamException

      Figure out which resource to start with in case of restart, open the delegate and restore delegate's position in the resource.
      Specified by:
        `open` in interface `ItemStream`
      Overrides:
        `open` in class `ItemStreamSupport`
      Parameters:
        `executionContext` - current step's `ExecutionContext`. Will be the executionContext from the last run of the step on a restart.
      Throws:
        `ItemStreamException`
      See Also:
        `ItemStream.open(ExecutionContext)`

    - #### update

          public void update(ExecutionContext executionContext)
                      throws ItemStreamException

      Store the current resource index and position in the resource.
      Specified by:
        `update` in interface `ItemStream`
      Overrides:
        `update` in class `ItemStreamSupport`
      Parameters:
        `executionContext` - to be updated
      Throws:
        `ItemStreamException`
      See Also:
        `ItemStream.update(ExecutionContext)`

    - #### setDelegate

          public void setDelegate(ResourceAwareItemReaderItemStream<? extends T> delegate)

      Parameters:
        `delegate` - reads items from single `Resource`.

    - #### setSaveState

          public void setSaveState(boolean saveState)

      Set the boolean indicating whether or not state should be saved in the provided `ExecutionContext` during the `ItemStream` call to update.
      Parameters:
        `saveState` - true to update ExecutionContext. False do not update ExecutionContext.

    - #### setComparator

          public void setComparator(java.util.Comparator<org.springframework.core.io.Resource> comparator)

      Parameters:
        `comparator` - used to order the injected resources, by default compares `Resource.getFilename()` values.

    - #### setResources

          public void setResources(org.springframework.core.io.Resource[] resources)

      Parameters:
        `resources` - input resources

    - #### getCurrentResource

          @Nullable
          public org.springframework.core.io.Resource getCurrentResource()

      Getter for the current resource.
      Returns:
        the current resource or `null` if all resources have been processed or the first resource has not been assigned yet.