1

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;
    }
}
4

1 に答える 1

2

Spring Integration 4.3 以降、以下がありますCompoundTrigger

* A {@link Trigger} that delegates the {@link #nextExecutionTime(TriggerContext)}
* to one of two Triggers. If the {@link #setOverride(Trigger) override} trigger is
* {@code null}, the primary trigger is invoked; otherwise the override trigger is
* invoked.

の組み合わせでCompoundTriggerAdvice:

* An {@link AbstractMessageSourceAdvice} that uses a {@link CompoundTrigger} to adjust
* the poller - when a message is present, the compound trigger's primary trigger is
* used to determine the next poll. When no message is present, the override trigger is
* used.

タスクに到達するために使用できます。

1日に 1 回だけタスクを実行するprimaryTriggerことができます。CronTrigger

再試行するのに必要な短い期間が必要な場合overrideがあります。PeriodicTrigger

ポーラー用retryにもう 1 つ使用できるロジック、または最終的に電子メールを送信するロジックを追加するためにそれを拡張することができます。AdviceCompoundTriggerAdvicecount

ファイルがないため、フローをキックするメッセージはありません。そして、ポーラー インフラストラクチャの周りを踊らない限り、選択の余地はありません。

于 2016-08-29T20:56:07.730 に答える