org.springframework.batch.item.support

## Class SynchronizedItemStreamReader<T>

- java.lang.Object
- - org.springframework.batch.item.support.SynchronizedItemStreamReader<T>

- Type Parameters:
    `T` - type of object being read
  All Implemented Interfaces:
    ItemReader<T>, ItemStream, ItemStreamReader<T>, org.springframework.beans.factory.InitializingBean

      public class SynchronizedItemStreamReader<T>
      extends java.lang.Object
      implements ItemStreamReader<T>, org.springframework.beans.factory.InitializingBean

  This is a simple ItemStreamReader decorator with a synchronized ItemReader.read() method - which makes a non-thread-safe ItemReader thread-safe. However, if reprocessing an item is problematic then using this will make a job not restartable. Here are some links about the motivation behind this class: - https://projects.spring.io/spring-batch/faq.html#threading-reader} - https://stackoverflow.com/a/20002493/2910265}
  Since:
    3.0.4
  Author:
    Matthew Ouyang

- - ### Constructor Summary

    Constructors
    Constructor and Description
    `SynchronizedItemStreamReader()`

  - ### Method Summary

    All Methods Instance Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `afterPropertiesSet()`
    `void` | `close()` If any resources are needed for the stream to operate they need to be destroyed here.
    `void` | `open(ExecutionContext executionContext)` Open the stream for the provided `ExecutionContext`.
    `T` | `read()` This delegates to the read method of the `delegate`
    `void` | `setDelegate(ItemStreamReader<T> delegate)`
    `void` | `update(ExecutionContext executionContext)` Indicates that the execution context provided during open is about to be saved.

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

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

- - ### Constructor Detail

    - #### SynchronizedItemStreamReader

          public SynchronizedItemStreamReader()

  - ### Method Detail

    - #### setDelegate

          public void setDelegate(ItemStreamReader<T> delegate)

    - #### read

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

      This delegates to the read method of the `delegate`
      Specified by:
        `read` in interface `ItemReader<T>`
      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()

      Description copied from interface: `ItemStream`
      If any resources are needed for the stream to operate they need to be destroyed here. Once this method has been called all other methods (except open) may throw an exception.
      Specified by:
        `close` in interface `ItemStream`

    - #### open

          public void open(ExecutionContext executionContext)

      Description copied from interface: `ItemStream`
      Open the stream for the provided `ExecutionContext`.
      Specified by:
        `open` in interface `ItemStream`
      Parameters:
        `executionContext` - current step's `ExecutionContext`. Will be the executionContext from the last run of the step on a restart.

    - #### update

          public void update(ExecutionContext executionContext)

      Description copied from interface: `ItemStream`
      Indicates that the execution context provided during open is about to be saved. If any state is remaining, but has not been put in the context, it should be added here.
      Specified by:
        `update` in interface `ItemStream`
      Parameters:
        `executionContext` - to be updated

    - #### afterPropertiesSet

          public void afterPropertiesSet()
                                  throws java.lang.Exception

      Specified by:
        `afterPropertiesSet` in interface `org.springframework.beans.factory.InitializingBean`
      Throws:
        `java.lang.Exception`