Как вызвать операции шлюза исходящей почты SFTP в конфигурации из компонента в Spring
Я посмотрел здесь здесь , и я не смог получить listFiles к работе:
@Bean
public SessionFactory<LsEntry> sftpSessionFactory() {
DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
factory.setHost("localhost");
factory.setPort(port);
factory.setUser("foo");
factory.setPassword("foo");
factory.setAllowUnknownKeys(true);
factory.setTestSession(true);
return new CachingSessionFactory<LsEntry>(factory);
}
@MessagingGateway
public interface MyGateway {
@Gateway(requestChannel = "sftpChannel")
List<File> listFiles();
}
@Bean
@ServiceActivator(inputChannel = "sftpChannel")
public MessageHandler handler() {
return new SftpOutboundGateway(ftpSessionFactory(), "ls", "'my_remote_dir/'");
}
где в моем классе @Component у меня есть это:
@Autowired
MyGateway gateway;
public void list(){
List<File> files = gateway.listFiles();
}
когда я запускаю это, я получаю сообщение об ошибке receive is not supported, because no pollable reply channel has been configured
Я предполагаю, что это проблема с моими знаниями / пониманием каналов интеграции. Возможно, мне не хватает bean-компонента, но моя главная цель здесь - заменить мое текущее использование адаптера inboundchannel для запроса файлов ad hoc вместо постоянного опроса файлового сервера.
Ответы
Да, история, упомянутая в Spring Integration Gateway без аргументов , определенно связана с вашей проблемой.
Вам не хватает того факта, что List<File> listFiles()
контракт поставляется без аргументов, поэтому для фреймворка неясно, что использовать для отправки в него sftpChannel
. Поэтому его пытаются позвонить receive
. Но поскольку у вас sftpChannel
нет PollableChannel
, вы получили эту ошибку. В любом случае это другая история, и это не то, что вы хотите получить в ответ на отправку сообщения в, sftpChannel
как вы пытаетесь сделать с этим контрактом шлюза.
Вам просто нужно быть более точным и сказать, что использовать в качестве полезной нагрузки для этого контракта шлюза без аргументов.
См. Дополнительную информацию в документации: https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway-calling-no-argument-methods. Это @Payload
ответ для вас. Или вы можете указать в payloadExpression
этой @Gateway
аннотации или defaultPayloadExpression
в @MessagingGateway
.