Jak wywołać operacje bramy wychodzącej SFTP w konfiguracji z komponentu na wiosnę
Szukałem tutaj tutaj i jestem w stanie dostać się do pracy 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/'");
}
gdzie w mojej klasie @Component mam to:
@Autowired
MyGateway gateway;
public void list(){
List<File> files = gateway.listFiles();
}
kiedy to uruchamiam, pojawia się błąd receive is not supported, because no pollable reply channel has been configured
Zakładam, że jest to problem z moją wiedzą / zrozumieniem kanałów integracji. Być może brakuje mi fasoli, ale moim głównym celem jest zastąpienie mojego obecnego użycia adaptera kanału przychodzącego do żądania plików ad hoc zamiast ciągłego odpytywania serwera plików
Odpowiedzi
Tak, historia wspomniana w Spring Integration Gateway bez argumentów jest zdecydowanie związana z Twoim problemem.
Brakuje Ci faktu, że List<File> listFiles()
umowa przychodzi bez argumentów, więc nie jest jasne dla ram, czego użyć do wysłania do niej sftpChannel
. Dlatego spróbuj zadzwonić receive
. Ale ponieważ sftpChannel
nie jest PollableChannel
, masz ten błąd. W każdym razie to inna historia, a nie to, co chcesz otrzymać jako odpowiedź z wysłania wiadomości do tego, sftpChannel
co próbujesz zrobić z tą umową dotyczącą bramy.
Musisz tylko wyrazić się bardziej jasno i powiedzieć, czego użyć jako ładunku dla tego kontraktu bramy bezargumentowej.
Zobacz więcej informacji w dokumentach: https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway-calling-no-argument-methods. To @Payload
jest odpowiedź dla Ciebie. Lub możesz określić payloadExpression
w tej @Gateway
adnotacji lub defaultPayloadExpression
w @MessagingGateway
.