Мне нужно ежедневно получать файл через 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;
}
}
'@ 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' –
Спасибо. Я нашел эту документацию сразу после публикации комментария, а затем удалил свой комментарий, но, видимо, вы все еще получили/увидели мой комментарий. Извини за это. – James
Рад быть полезным! Итак, пришло время принять мой ответ и позволить другим людям знать, что у нас есть решение здесь! И мы будем свободны делать свою работу :) –