So rufen Sie SFTP Outbound Gateway-Vorgänge in der Konfiguration von Component in Spring auf

Dec 18 2020

Ich habe hier hier gesucht und kann listFiles nicht zum Laufen bringen:

    @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/'");
    }

Wo in meiner @ Component-Klasse habe ich Folgendes:

    @Autowired
    MyGateway gateway;

    public void list(){
        List<File> files = gateway.listFiles();
    }

Wenn ich dies ausführe, erhalte ich eine Fehlermeldung receive is not supported, because no pollable reply channel has been configured

Ich gehe davon aus, dass dies ein Problem mit meinem Wissen / Verständnis über Integrationskanäle ist. Vielleicht fehlt mir eine Bean, aber mein Hauptziel hier ist es, meine derzeitige Verwendung des Inboundchannel-Adapters zu ersetzen, um Dateien ad hoc anzufordern, anstatt den Dateiserver kontinuierlich abzufragen

Antworten

1 ArtemBilan Dec 18 2020 at 02:34

Ja, die im Spring Integration Gateway ohne Argumente erwähnte Geschichte hängt definitiv mit Ihrem Problem zusammen.

Sie vermissen die Tatsache, dass der List<File> listFiles()Vertrag ohne Argumente geliefert wird, sodass für den Rahmen nicht klar ist, was für das Senden an diesen Vertrag verwendet werden soll sftpChannel. Deshalb versucht es anzurufen receive. Aber da dies nicht der Fall sftpChannelist PollableChannel, haben Sie diesen Fehler erhalten. Auf jeden Fall ist das eine andere Geschichte und nicht das, was Sie als Antwort erhalten möchten, wenn Sie eine Nachricht an das senden, sftpChannelwährend Sie versuchen, mit diesem Gateway-Vertrag fertig zu werden.

Sie müssen nur expliziter sein und angeben, was als Nutzlast für diesen No-Arg-Gateway-Vertrag verwendet werden soll.

Weitere Informationen finden Sie in den Dokumenten: https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway-calling-no-argument-methods. Das @Payloadist eine Antwort für Sie. Oder Sie können eine payloadExpressionin dieser @GatewayAnmerkung oder eine defaultPayloadExpressionin der Anmerkung angeben @MessagingGateway.