Spring Integration Sftp: иногда для завершения операции требуется более 15 минут

#spring-boot #spring-integration #jsch #spring-integration-sftp

#spring-boot #spring-интеграция #jsch #spring-интеграция-sftp

Вопрос:

Я использую Spring Integration sftp для размещения файлов на удаленном сервере, а ниже приведена конфигурация.

 <spring-integration.version>5.2.5.RELEASE</spring-integration.version>
 

Я настроил @MessagingGateway.

 @MessagingGateway
public interface SftpMessagingGateway {
 
     @Gateway(requestChannel = "sftpOutputChannel")
     void sendToFTP(Message<?> message);
     
}
 

Я настроил обработчик сообщений, как показано ниже,

 @Bean
@ServiceActivator(inputChannel = "sftpOutputChannel" )
public MessageHandler genericOutboundhandler() {
    SftpMessageHandler handler = new SftpMessageHandler(outboundTemplate(), FileExistsMode.APPEND);
    handler.setRemoteDirectoryExpressionString("headers['remote_directory']");
    handler.setFileNameGenerator((Message<?> message) -> ((String) message.getHeaders().get(Constant.FILE_NAME_KEY)));
    handler.setUseTemporaryFileName(false);
    return handler;
}
 

Я настроил SftpRemoteFileTemplate, как показано ниже

 private SftpRemoteFileTemplate outboundTemplate;

public SftpRemoteFileTemplate outboundTemplate(){
    if (outboundTemplate == null) {
        outboundTemplate = new SftpRemoteFileTemplate(sftpSessionFactory());
    }
    return outboundTemplate;
}
 

Это конфигурация для SessionFactory

 public SessionFactory<LsEntry> sftpSessionFactory() {
    DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory();
    factory.setHost(host);
    factory.setPort(port);
    factory.setUser(username);
    factory.setPassword(password);
    factory.setAllowUnknownKeys(true);
    factory.setKnownHosts(host);
    factory.setSessionConfig(configPropertiesOutbound());
    CachingSessionFactory<LsEntry> csf = new CachingSessionFactory<LsEntry>(factory);
    csf.setSessionWaitTimeout(1000);
    csf.setPoolSize(10);
    csf.setTestSession(true);
    return csf;
}
 

Я настроил все это в одном из сервисов.

Теперь проблема в том,,

Иногда вся операция занимает более 15 минут ~ особенно, если сервис идеален в течение нескольких часов, и я не уверен, что вызывает эту проблему. Похоже, что он тратит время на получение активного сеанса из CachedSessionFactory после того, как операции выполняются довольно быстро, ниже приведена привязка к одному из инструментов, где мне удалось зафиксировать время.

введите описание изображения здесь

Обычно для передачи файлов требуется несколько миллисекунд.

Недавно я внес нижеприведенные изменения, но и до этого у меня была такая же проблема,

  • Я установил isShareSession в значение false ранее это было DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
  • Не было размера пула, я установил его равным 10

Я думаю, что я что-то неправильно настроил, и поэтому я в конечном итоге подключаю соединение? Или есть что-то еще?

Наблюдение :

Время, необходимое для завершения операции, все время примерно одинаково, когда возникает проблема, т.е. 938000 миллисекунд

Если я ежедневно перезапускаю приложение, оно работает отлично.

Комментарии:

1. <spring-integration.version>5.2.5.RELEASE</spring-integration.version> — Интересно, можете ли вы перейти на последнюю 5.2.9 версию или даже лучше напрямую 5.4.1 : spring.io/projects/spring-integration#learn . И посмотрите, как это работает с этим. Вероятно, у нас было какое-то промежуточное исправление.

2. Конечно, я попробую, еще одна вещь ранее, при рефакторинге кода я удалил @bean из SessionFactory и SftpRemoteTemplate и сохранил MessageHandler только в контейнере, предполагая, что он позаботится об этих двух, как вы думаете, это может вызвать проблему? все эти конфигурации являются частью одного и того же класса.

3. Нет, они должны быть объявлены как компоненты. Ответственность за их жизненный цикл не лежит на обработчике