Cómo llamar a las operaciones de puerta de enlace de salida SFTP en la configuración del componente en Spring
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
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 sftpChannel
no 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 sftpChannel
como 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 @Payload
es una respuesta para ti. O puede especificar un payloadExpression
en esa @Gateway
anotación o defaultPayloadExpression
en el @MessagingGateway
.