2
Spring統合では、ファイル(サブフォルダのファイルを含む)をftpインバウンドチャネルアダプタを使用して再帰的に同期できますか?Spring統合ftpインバウンドチャネルアダプタ再帰的同期
Spring統合では、ファイル(サブフォルダのファイルを含む)をftpインバウンドチャネルアダプタを使用して再帰的に同期できますか?Spring統合ftpインバウンドチャネルアダプタ再帰的同期
いいえ;しかし、あなたは...アウトバウンドゲートウェイとの再帰MGETとの完全なリモートディレクトリツリーを取得することができます
@SpringBootApplication
@IntegrationComponentScan
public class So42324318Application {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(So42324318Application.class, args);
List<File> files = context.getBean(Gateway.class).fetchFiles("foo/*");
System.out.println(files);
context.close();
}
@MessagingGateway(defaultRequestChannel = "fetchRecursive")
public interface Gateway {
public List<File> fetchFiles(String remoteDir);
}
@Bean
@ServiceActivator(inputChannel = "fetchRecursive")
public FtpOutboundGateway gateway() {
// Create a recursive MGET gateway that gets the remote directory from the payload
FtpOutboundGateway gateway = new FtpOutboundGateway(sessionFactory(), "mget", "payload");
gateway.setOptions("-R");
gateway.setLocalDirectoryExpression(new SpelExpressionParser().parseExpression("#remoteDirectory"));
return gateway;
}
@Bean
public SessionFactory<FTPFile> sessionFactory() {
return new CachingSessionFactory<>(ftpSF());
}
private SessionFactory<FTPFile> ftpSF() {
DefaultFtpSessionFactory sf = new DefaultFtpSessionFactory();
sf.setHost("10.0.0.3");
sf.setUsername("ftptest");
sf.setPassword("ftptest");
sf.setClientMode(FTPClient.PASSIVE_LOCAL_DATA_CONNECTION_MODE);
return sf;
}
}
結果:迅速な対応のための
2017-02-19 09:55:09.351 INFO 61921 --- [ main] o.s.integration.ftp.session.FtpSession : File has been successfully transferred from: foo/bar.tx
2017-02-19 09:55:09.353 INFO 61921 --- [ main] o.s.integration.ftp.session.FtpSession : File has been successfully transferred from: foo/bar.txt
2017-02-19 09:55:09.356 INFO 61921 --- [ main] o.s.integration.ftp.session.FtpSession : File has been successfully transferred from: foo/bar/abc.txt
2017-02-19 09:55:09.358 INFO 61921 --- [ main] o.s.integration.ftp.session.FtpSession : File has been successfully transferred from: foo/baz.txt
2017-02-19 09:55:09.362 INFO 61921 --- [ main] o.s.integration.ftp.session.FtpSession : File has been successfully transferred from: foo/foo/bar/qux.txt
2017-02-19 09:55:09.364 INFO 61921 --- [ main] o.s.integration.ftp.session.FtpSession : File has been successfully transferred from: foo/foo/baz/fiz.txt
[foo/bar.tx, foo/bar.txt, foo/bar/abc.txt, foo/baz.txt, foo/foo/bar/qux.txt, foo/foo/baz/fiz.txt]
おかげ@Gary。あなたのコードでは、ディレクトリ階層を持つファイルを取得することができます。私はポーリングし、リモートサーバー上で更新されたファイルを取得する必要があります。どのように私はアウトバウンドgateway.Basically私はローカルファイルを同期する必要がありますツリー構造は元のままです)。 – user2654631
'FileExistsMode'をIGNOREに設定すると、各MGETは以前にフェッチされていない新しいファイルのみを取得します。 5.0リリースでは、存在するがタイムスタンプの異なるファイルを再取得する[新しいモード](https://github.com/spring-projects/spring-integration/pull/2062) 'REPLACE_IF_MODIFIED'があります(私は昨日PRを作成しました)。あなたのための別の解決策は、インバウンドアダプタで[smart poller](http://docs.spring.io/spring-integration/reference/html/messaging-channels-section.html#__smart_polling)を使用し、リモートポーリングがnullを返すときにはローカルディレクトリ。 –