web-dev-qa-db-ja.com

Spring BootでFTPからファイルを送受信する

私はSpring Frameworkを初めて使用し、実際にSpring Bootを使用しています。最近、開発中のアプリでQuartz Schedulerを機能させ、Spring Integrationをそこで機能させたいと思います。サーバーへのFTP接続でファイルの書き込みと読み取りを行います。

私が欲しいのは本当に簡単です(以前のJavaアプリケーションでそうすることができたので)。2つのQuartzジョブが毎日異なる時間に実行されるようにスケジュールされています:1つFTPサーバーからファイルを読み取り、別のFTPサーバーにファイルを書き込みます。

これまでに開発した内容を詳しく説明します。

@SpringBootApplication
@ImportResource("classpath:ws-config.xml")
@EnableIntegration
@EnableScheduling
public class MyApp extends SpringBootServletInitializer {

    @Autowired
    private Configuration configuration;

    //...

    @Bean
    public DefaultFtpsSessionFactory  myFtpsSessionFactory(){
        DefaultFtpsSessionFactory sess = new DefaultFtpsSessionFactory();
        Ftp ftp = configuration.getFtp();
        sess.setHost(ftp.getServer());
        sess.setPort(ftp.getPort());
        sess.setUsername(ftp.getUsername());
        sess.setPassword(ftp.getPassword());
        return sess;
    }

}

次のクラスは、FtpGatewayとして名前を付けました。

@Component
public class FtpGateway {

    @Autowired
    private DefaultFtpsSessionFactory sess;

    public void sendFile(){
        // todo
    }

    public void readFile(){
        // todo
    }

}

私は this ドキュメントを読んで、その方法を学びます。 Spring IntegrationのFTPはイベントドリブンであるように思われるため、トリガーが正確なタイミングで起動されたときに、ジョブからsendFile()とreadFile()のどちらを実行できるかわかりません。

ドキュメントは私に 何か インバウンドチャネルアダプタ(FTPからファイルを読み取る?)、アウトバウンドチャネルアダプタ(FTPにファイルを書き込む?)、およびアウトバウンドゲートウェイ(何をするか?)の使用について教えています。

Spring Integrationは、インバウンドチャネルアダプター、アウトバウンドチャネルアダプター、アウトバウンドゲートウェイの3つのクライアント側エンドポイントを提供することにより、FTP/FTPSを介したファイルの送受信をサポートしています。また、これらのクライアントコンポーネントを定義するための名前空間ベースの便利な構成オプションも提供します。

したがって、私は従う方法として明確にしていない。

誰か、私にヒントをくれませんか?

ありがとうございました!

[〜#〜]編集[〜#〜]

@Mありがとうございます。 Deinum。まず、簡単なタスクを試してみましょう。FTPからファイルを読み取ると、ポーラーが5秒ごとに実行されます。これは私が追加したものです:

@Bean
public FtpInboundFileSynchronizer ftpInboundFileSynchronizer() {
    FtpInboundFileSynchronizer fileSynchronizer = new FtpInboundFileSynchronizer(myFtpsSessionFactory());
    fileSynchronizer.setDeleteRemoteFiles(false);
    fileSynchronizer.setPreserveTimestamp(true);
    fileSynchronizer.setRemoteDirectory("/Entrada");
    fileSynchronizer.setFilter(new FtpSimplePatternFileListFilter("*.csv"));
    return fileSynchronizer;
}


@Bean
@InboundChannelAdapter(channel = "ftpChannel", poller = @Poller(fixedDelay = "5000"))
public MessageSource<File> ftpMessageSource() {
    FtpInboundFileSynchronizingMessageSource source = new FtpInboundFileSynchronizingMessageSource(inbound);
    source.setLocalDirectory(new File(configuracion.getDirFicherosDescargados()));
    source.setAutoCreateLocalDirectory(true);
    source.setLocalFilter(new AcceptOnceFileListFilter<File>());
    return source;
}

@Bean
@ServiceActivator(inputChannel = "ftpChannel")
public MessageHandler handler() {
    return new MessageHandler() {

        @Override
        public void handleMessage(Message<?> message) throws MessagingException {
            Object payload = message.getPayload();
            if(payload instanceof File){
                File f = (File) payload;
                System.out.println(f.getName());
            }else{
                System.out.println(message.getPayload());
            }
        }

    };
}

次に、アプリが実行されているときに、新しいcsvファイルのイントロ「Entrada」リモートフォルダーを配置しましたが、handler()メソッドが5秒後に実行されません...何か問題がありますか?

17
russellhoff

ポーラーメソッドに@ Scheduled(fixedDelay = 5000)を追加してください。

1
Mr Nobody

タスクレットではSPRING BATCHを使用する必要があります。 Springが提供する既存のインターフェースを使用して、Bean、クローンタイム、入力ソースを構成する方がはるかに簡単です。

https://www.baeldung.com/introduction-to-spring-batch

上記の例はアノテーションとxmlベースの両方ですが、どちらでも使用できます。

その他の利点リスナーと並列ステップを利用します。このフレームワークは、リーダー-プロセッサ-ライターの方法でも使用できます。

0
Swarit Agarwal