Como chamar operações de gateway de saída SFTP na configuração do componente na primavera
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
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ê sftpChannel
nã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 sftpChannel
como 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 payloadExpression
nessa @Gateway
anotação ou um defaultPayloadExpression
no @MessagingGateway
.