私は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秒後に実行されません...何か問題がありますか?
ポーラーメソッドに@ Scheduled(fixedDelay = 5000)を追加してください。
タスクレットではSPRING BATCHを使用する必要があります。 Springが提供する既存のインターフェースを使用して、Bean、クローンタイム、入力ソースを構成する方がはるかに簡単です。
https://www.baeldung.com/introduction-to-spring-batch
上記の例はアノテーションとxmlベースの両方ですが、どちらでも使用できます。
その他の利点リスナーと並列ステップを利用します。このフレームワークは、リーダー-プロセッサ-ライターの方法でも使用できます。