Comment appeler les opérations de passerelle sortante SFTP dans la configuration à partir du composant au printemps

Dec 18 2020

Je l' ai regardé ici ici et je suis incapable de se ListFiles au travail:

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

où dans ma classe @Component j'ai ceci:

    @Autowired
    MyGateway gateway;

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

quand je lance ça, j'obtiens une erreur receive is not supported, because no pollable reply channel has been configured

Je suppose que c'est un problème avec ma connaissance / compréhension des canaux d'intégration. Il me manque peut-être un bean, mais mon objectif principal ici est de remplacer mon utilisation actuelle de l'adaptateur de canal entrant pour demander des fichiers ad hoc au lieu d'interroger en permanence le serveur de fichiers

Réponses

1 ArtemBilan Dec 18 2020 at 02:34

Oui, l'histoire mentionnée dans Spring Integration Gateway sans arguments est définitivement liée à votre problème.

Vous manquez le fait que le List<File> listFiles()contrat est livré sans arguments, de sorte que le cadre ne sait pas quoi utiliser pour envoyer à cela sftpChannel. Par conséquent, il essaie d'appeler receive. Mais puisque ce sftpChanneln'est pas le cas PollableChannel, vous avez cette erreur. Quoi qu'il en soit, c'est une histoire différente et non ce que vous voulez obtenir en tant que réponse en envoyant un message au sftpChannelcomme vous essayez de le faire avec ce contrat de passerelle.

Vous avez juste besoin d'être plus explicite et de dire quoi utiliser comme charge utile pour ce contrat de passerelle sans argument.

Voir plus d'informations dans la documentation: https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway-calling-no-argument-methods. Le @Payloadest une réponse pour vous. Ou vous pouvez spécifier un payloadExpressionsur cette @Gatewayannotation ou un defaultPayloadExpressionsur le @MessagingGateway.