This module provides a SFTP supplier that can be reused and composed in other applications.
The Supplier
uses various Sftp
inbound adapters from Spring Integration to support a range of modes to consume data from an SFTP server.
These include:
-
Synchronize remote files to a local directory and supplying the File contents, the File reference, or a message per line.
-
Stream remote file contents as a byte array directly without copying to a local directory.
-
List the remote file names only.
Messages emitted by the supplier are provided as a byte array by default. However, this can be customized using the mode
option:
-
ref Provides a
java.io.File
reference -
lines Will split files line-by-line and emit a new message for each line
-
contents The default. Provides the contents of a file as a byte array
Note
|
The ref mode (file.consumer.mode=ref ) is not compatible when streaming results (sftp.stream=true ).
|
Note
|
When using the lines mode, you can provide an additional withMarker option (via the file.consumer.with-marker property).
If set to true , the underlying FileSplitter will emit additional start-of-file and end-of-file marker messages before and after the actual data.
The payload of these 2 additional marker messages is of type FileSplitter.FileMarker .
When not explicitly set, the option defaults to false .
|
When configuring the sftp.factory.known-hosts-expression
option, the root object of the evaluation is the application context, an example might be sftp.factory.known-hosts-expression = @systemProperties['user.home'] + '/.ssh/known_hosts'
.
By default, the supplier uses a SimpleMetadataStore, storing the last modified time to track files that have already been processed in memory.
If an application using this supplier is restarted, any existing files will be reprocessed. You can inject on of the persistent MetadataStore implementations provided by Spring Integration, or your own of course, to maintain this state permanently.
See also MetadataStore
options for possible shared persistent store configuration for the SftpPersistentAcceptOnceFileListFilter
used in the SFTP Source.
This source supports consuming from multiple SFTP servers.
This requires configuring an SFTP Session Factory for each server.
The labels one
and two
shown below can be replaced by any names you want.
The following configuration will rotate between two SFTP servers (this can also be used for multiple directories on the same server), consuming files in a round-robin fashion:
sftp.supplier.factories.one.host=host1
sftp.supplier.factories.one.port=1234,
sftp.supplier.factories.one.username = user1,
sftp.supplier.factories.one.password = pass1,
...
sftp.supplier.factories.two.host=host2,
sftp.supplier.factories.two.port=2345,
sftp.supplier.factories.two.username = user2,
sftp.supplier.factories.two.password = pass2,
sftp.supplier.directories=one.sftpSource,two.sftpSecondSource,
sftp.supplier.max-fetch=1,
sftp.supplier.fair=true
SFtpSupplier
is implemented as a java.util.function.Supplier
.
This supplier gives you a reactive stream of objects from the provided directory(ies) as the supplier has a signature of Supplier<Flux<Message<?>>>
.
Users have to subscribe to this Flux
and receive the data.
The SftpSupplierConfiguration
auto-configuration provides the following bean:
sftpSupplier
You need to inject this as Supplier<Flux<Message<?>>>
.
You can use sftpSupplier
as a qualifier when injecting.
Once injected, you can use the get
method of the Supplier
to invoke it and then subscribe to the returned Flux
.
All configuration properties are prefixed with sftp.supplier
.
There are also properties that need to be used with the prefix file.consumer
.
For more information on the various options available, please see SftpSupplierProperties.
Also see FileConsumerProperties
.
See this test suite for the various ways, this supplier is used.
See this README where this supplier is used to create a Spring Cloud Stream application that provides an Sftp Source.