Como chamar operações de gateway de saída SFTP na configuração do componente na primavera

Dec 18 2020

Eu olhei aqui aqui e não consigo fazer listFiles funcionar:

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

onde na minha classe @Component eu tenho isso:

    @Autowired
    MyGateway gateway;

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

quando eu executo isso, recebo um erro receive is not supported, because no pollable reply channel has been configured

Presumo que este seja um problema com o meu conhecimento / compreensão dos canais de integração. Talvez esteja faltando um bean, mas meu principal objetivo aqui é substituir meu uso atual do adaptador de canal de entrada para solicitar arquivos ad hoc em vez de pesquisar continuamente o servidor de arquivos

Respostas

1 ArtemBilan Dec 18 2020 at 02:34

Sim, a história mencionada no Spring Integration Gateway sem argumentos está definitivamente relacionada ao seu problema.

Você está perdendo o fato de que o List<File> listFiles()contrato vem sem argumentos, então não está claro para a estrutura o que usar para enviá-la sftpChannel. Portanto, tente ligar receive. Mas como você sftpChannelnão é PollableChannel, você obteve esse erro. De qualquer forma, essa é uma história diferente e não o que você deseja obter como resposta ao enviar uma mensagem ao sftpChannelcomo tenta fazer com aquele contrato de gateway.

Você só precisa ser mais explícito e dizer o que usar como carga útil para esse contrato de gateway sem argumentos.

Veja mais informações nos documentos: https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway-calling-no-argument-methods. Esta @Payloadé uma resposta para você. Ou você pode especificar um payloadExpressionnessa @Gatewayanotação ou um defaultPayloadExpressionno @MessagingGateway.