Comment appeler les opérations de passerelle sortante SFTP dans la configuration à partir du composant au printemps
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
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 sftpChannel
n'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 sftpChannel
comme 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 @Payload
est une réponse pour vous. Ou vous pouvez spécifier un payloadExpression
sur cette @Gateway
annotation ou un defaultPayloadExpression
sur le @MessagingGateway
.