Я посмотрел здесь здесь и не могу заставить 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
.
Может быть, уже слишком поздно, но вы также можете изменить свой контракт шлюза без аргументов на контракт с одним аргументом, в котором нечего дополнительно аннотировать.
@MessagingGateway
public interface MyGateway {
@Gateway(requestChannel = "sftpChannel")
List<File> listFiles(String remoteDir);
}
@Bean
@ServiceActivator(inputChannel = "sftpChannel")
public MessageHandler handler() {
return new SftpOutboundGateway(ftpSessionFactory(), Command.LS, "payload");
}
В вашем классе @Component у вас будет:
@Autowired
MyGateway gateway;
public void list(){
List<File> files = gateway.listFiles("'my_remote_dir/'");
}
Может ли это быть той же проблемой, что и в stackoverflow.com/questions/9790323/…?