Cómo llamar a las operaciones de puerta de enlace de salida SFTP en la configuración del componente en Spring

Dec 18 2020

He mirado aquí aquí y no puedo hacer que listFiles funcione:

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

donde en mi clase @Component tengo esto:

    @Autowired
    MyGateway gateway;

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

cuando ejecuto esto, aparece un error receive is not supported, because no pollable reply channel has been configured

Supongo que esto es un problema con mi conocimiento / comprensión de los canales de integración. Quizás me falta un bean, pero mi objetivo principal aquí es reemplazar mi uso actual del adaptador de canal de entrada para solicitar archivos ad hoc en lugar de sondear continuamente el servidor de archivos

Respuestas

1 ArtemBilan Dec 18 2020 at 02:34

Sí, la historia mencionada en Spring Integration Gateway sin argumentos definitivamente está relacionada con su problema.

Se está perdiendo el hecho de que el List<File> listFiles()contrato viene sin argumentos, por lo que no está claro para el marco qué utilizar para enviarlo sftpChannel. Por eso intenta llamar receive. Pero como tu sftpChannelno lo es PollableChannel, tienes ese error. De todos modos, esa es una historia diferente y no lo que desea obtener como respuesta al enviar un mensaje al sftpChannelcomo intenta hacer con ese contrato de puerta de enlace.

Solo necesita ser más explícito y decir qué usar como carga útil para ese contrato de puerta de enlace sin argumentos.

Ver más información en los documentos: https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway-calling-no-argument-methods. La @Payloades una respuesta para ti. O puede especificar un payloadExpressionen esa @Gatewayanotación o defaultPayloadExpressionen el @MessagingGateway.