2016-08-29 1 views
1

Мне нужно ежедневно получать файл через SFTP. Я хотел бы использовать Spring Integration с конфигурацией Java. Файл обычно доступен в определенное время каждый день. Приложение должно пытаться получить файл около этого времени каждый день. Если файл недоступен, он должен продолжать повторять попытку x. После попыток x он должен отправить электронное письмо, чтобы администратор знал, что файл по-прежнему недоступен на сайте SFTP.Как получить файл ежедневно через SFTP с помощью Spring Integration с конфигурацией Java?

Один из вариантов заключается в использовании SftpInboundFileSynchronizingMessageSource. В MessageHandler я могу запустить задание для обработки файла. Однако мне не нужна синхронизация с удаленной файловой системой. В конце концов, это запланированная поставка файла. Кроме того, мне нужно задержать не более 15 минут для следующей повторной попытки, и опрос каждые 15 минут кажется немного переборщиком для ежедневного файла. Я предполагаю, что я мог бы использовать это, но мне понадобился бы какой-то механизм для отправки электронной почты по истечении определенного времени и никакого файла не было получено.

Другой вариант, по-видимому, использует get SFTP исходящего шлюза. Но единственные примеры, которые я могу найти, кажутся конфигурацией XML.

Update

Добавление кода после использования помощи, предоставляемой ответом Артема Билана ниже:

класс конфигурации:

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

ответ

2

С весной Инта Gration 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. 

он может быть использован для достижения вашей задачи:

primaryTrigger может стать CronTrigger запустить только задачу один раз в день.

override может быть PeriodicTrigger с требуемым коротким периодом, чтобы повторить попытку.

retry логики вы можете использовать более одного Advice для Poller или просто расширить, что CompoundTriggerAdvice добавить count логики, чтобы отправить по электронной почте в конце концов.

Поскольку нет файла, поэтому нет сообщения, чтобы запустить поток. И у нас нет выбора, если вы не будете танцевать вокруг инфраструктуры игроков.

+1

'@ Poller' имеет' value() ', чтобы принять имя bean-поля PollerMetadata. И там вы можете настроить 'trigger',' maxMessagesPerPoll' и 'adviceChain' с желаемым' CompoundTriggerAdvice'. http://docs.spring.io/spring-integration/docs/4.3.1.RELEASE/reference/html/configuration.html#annotations и поиск '@ Poller' –

+0

Спасибо. Я нашел эту документацию сразу после публикации комментария, а затем удалил свой комментарий, но, видимо, вы все еще получили/увидели мой комментарий. Извини за это. – James

+0

Рад быть полезным! Итак, пришло время принять мой ответ и позволить другим людям знать, что у нас есть решение здесь! И мы будем свободны делать свою работу :) –

Смежные вопросы