Jak wywołać operacje bramy wychodzącej SFTP w konfiguracji z komponentu na wiosnę

Dec 18 2020

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

1 ArtemBilan Dec 18 2020 at 02:34

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ż sftpChannelnie 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, sftpChannelco 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 @Payloadjest odpowiedź dla Ciebie. Lub możesz określić payloadExpressionw tej @Gatewayadnotacji lub defaultPayloadExpressionw @MessagingGateway.