SFTP 経由で毎日ファイルを取得する必要があります。Java config で Spring Integration を使用したいと思います。ファイルは通常、毎日特定の時間に利用可能です。アプリケーションは、毎日その時刻近くにファイルを取得しようとする必要があります。ファイルが利用できない場合は、x回試行し続ける必要があります。x回試行した後、ファイルがまだSFTPサイトで利用できないことを管理者に知らせるメールを送信する必要があります。
1 つのオプションは、 を使用することSftpInboundFileSynchronizingMessageSource
です。でMessageHandler
、ファイルを処理するジョブを開始できます。ただし、リモート ファイル システムとの同期は本当に必要ありません。所詮、ファイルの定期配信です。さらに、次の再試行まで最大 15 分遅らせる必要があり、15 分ごとにポーリングするのは、毎日のファイルには少しやり過ぎに思えます。これを使用できると思いますが、一定の時間が経過してファイルが受信されなかった後に電子メールを送信するためのメカニズムが必要になります。
もう 1 つのオプションget
は、SFTP アウトバウンド ゲートウェイを使用しているようです。しかし、私が見つけることができる唯一の例は、XML 構成のようです。
アップデート
以下の Artem Bilan の回答で提供されるヘルプを使用した後にコードを追加します。
構成クラス:
@Bean
@InboundChannelAdapter(autoStartup="true", channel = "sftpChannel", poller = @Poller("pollerMetadata"))
public SftpInboundFileSynchronizingMessageSource sftpMessageSource(ApplicationProperties applicationProperties, PropertiesPersistingMetadataStore store) {
SftpInboundFileSynchronizingMessageSource source =
new SftpInboundFileSynchronizingMessageSource(sftpInboundFileSynchronizer(applicationProperties));
source.setLocalDirectory(new File("ftp-inbound"));
source.setAutoCreateLocalDirectory(true);
FileSystemPersistentAcceptOnceFileListFilter local = new FileSystemPersistentAcceptOnceFileListFilter(store,"test");
source.setLocalFilter(local);
source.setCountsEnabled(true);
return source;
}
@Bean
public PollerMetadata pollerMetadata() {
PollerMetadata pollerMetadata = new PollerMetadata();
List<Advice> adviceChain = new ArrayList<Advice>();
adviceChain.add(retryCompoundTriggerAdvice());
pollerMetadata.setAdviceChain(adviceChain);
pollerMetadata.setTrigger(compoundTrigger());
return pollerMetadata;
}
@Bean
public RetryCompoundTriggerAdvice retryCompoundTriggerAdvice() {
return new RetryCompoundTriggerAdvice(compoundTrigger(), secondaryTrigger());
}
@Bean
public CompoundTrigger compoundTrigger() {
CompoundTrigger compoundTrigger = new CompoundTrigger(primaryTrigger());
return compoundTrigger;
}
@Bean
public Trigger primaryTrigger() {
return new CronTrigger("*/60 * * * * *");
}
@Bean
public Trigger secondaryTrigger() {
return new PeriodicTrigger(10000);
}
@Bean
@ServiceActivator(inputChannel = "sftpChannel")
public MessageHandler handler(PropertiesPersistingMetadataStore store) {
return new MessageHandler() {
@Override
public void handleMessage(Message<?> message) throws MessagingException {
System.out.println(message.getPayload());
store.flush();
}
};
}
RetryCompoundTriggerAdvice クラス:
public class RetryCompoundTriggerAdvice extends AbstractMessageSourceAdvice {
private final CompoundTrigger compoundTrigger;
private final Trigger override;
private int count = 0;
public RetryCompoundTriggerAdvice(CompoundTrigger compoundTrigger, Trigger overrideTrigger) {
Assert.notNull(compoundTrigger, "'compoundTrigger' cannot be null");
this.compoundTrigger = compoundTrigger;
this.override = overrideTrigger;
}
@Override
public boolean beforeReceive(MessageSource<?> source) {
return true;
}
@Override
public Message<?> afterReceive(Message<?> result, MessageSource<?> source) {
if (result == null && count <= 5) {
count++;
this.compoundTrigger.setOverride(this.override);
}
else {
this.compoundTrigger.setOverride(null);
if (count > 5) {
//send email
}
count = 0;
}
return result;
}
}