#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. Нет, они должны быть объявлены как компоненты. Ответственность за их жизненный цикл не лежит на обработчике