Class FileReadingMessageSource

All Implemented Interfaces:
Aware, BeanFactoryAware, BeanNameAware, DisposableBean, InitializingBean, Lifecycle, MessageSource<File>, IntegrationPattern, NamedComponent, IntegrationInboundManagement, IntegrationManagement, ManageableLifecycle

public class FileReadingMessageSource
extends AbstractMessageSource<File>
implements ManageableLifecycle
MessageSource that creates messages from a file system directory. To prevent messages for certain files, you may supply a FileListFilter. By default, when configuring with XML or the DSL, an AcceptOnceFileListFilter is used. It ensures files are picked up only once from the directory.

A common problem with reading files is that a file may be detected before it is ready. The default AcceptOnceFileListFilter does not prevent this. In most cases, this can be prevented if the file-writing process renames each file as soon as it is ready for reading. A pattern-matching filter that accepts only files that are ready (e.g. based on a known suffix), composed with the default AcceptOnceFileListFilter would allow for this.

If a external DirectoryScanner is used, then the FileLocker and FileListFilter objects should be set on the external DirectoryScanner, not the instance of FileReadingMessageSource. An IllegalStateException will result otherwise.

A Comparator can be used to ensure internal ordering of the Files in a PriorityBlockingQueue. This does not provide the same guarantees as a ResequencingMessageGroupProcessor, but in cases where writing files and failure downstream are rare it might be sufficient.

FileReadingMessageSource is fully thread-safe under concurrent receive() invocations and message delivery callbacks.

Iwein Fuld, Mark Fisher, Oleg Zhurakousky, Gary Russell, Artem Bilan, Steven Pearce
  • Constructor Details

    • FileReadingMessageSource

      public FileReadingMessageSource()
      Create a FileReadingMessageSource with a naturally ordered queue of unbounded capacity.
    • FileReadingMessageSource

      public FileReadingMessageSource​(int internalQueueCapacity)
      Create a FileReadingMessageSource with a bounded queue of the given capacity. This can be used to reduce the memory footprint of this component when reading from a large directory.
      internalQueueCapacity - the size of the queue used to cache files to be received internally. This queue can be made larger to optimize the directory scanning. With scanEachPoll set to false and the queue to a large size, it will be filled once and then completely emptied before a new directory listing is done. This is particularly useful to reduce scans of large numbers of files in a directory.
    • FileReadingMessageSource

      public FileReadingMessageSource​(@Nullable Comparator<File> receptionOrderComparator)
      Create a FileReadingMessageSource with a PriorityBlockingQueue ordered with the passed in Comparator.

      The size of the queue used should be large enough to hold all the files in the input directory in order to sort all of them, so restricting the size of the queue is mutually exclusive with ordering. No guarantees about file delivery order can be made under concurrent access.

      receptionOrderComparator - the comparator to be used to order the files in the internal queue
  • Method Details