Spring'de Bileşenden Yapılandırmada SFTP Giden Ağ Geçidi işlemleri nasıl çağrılır
Burada baktık burada ve işe ListFiles alamıyor:
@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/'");
}
@Component sınıfımda buna sahibim:
@Autowired
MyGateway gateway;
public void list(){
List<File> files = gateway.listFiles();
}
bunu çalıştırdığımda bir hata alıyorum receive is not supported, because no pollable reply channel has been configured
Bunun entegrasyon kanalları hakkındaki bilgim / anlayışımla ilgili bir sorun olduğunu varsayıyorum. Belki de bir fasulye özledim, ancak buradaki asıl amacım, dosya sunucusunu sürekli olarak sorgulamak yerine geçici olarak dosya istemek için gelen kanal bağdaştırıcısını şu anki kullanımımı değiştirmek.
Yanıtlar
Evet, Spring Integration Gateway'de tartışmasız bahsedilen hikaye kesinlikle sorununuzla ilgilidir.
List<File> listFiles()
Sözleşmenin argümansız geldiği gerçeğini kaçırıyorsunuz , bu nedenle ona göndermek için ne kullanacağınız çerçeve için açık değil sftpChannel
. Bu nedenle aramaya çalışır receive
. Ama senin sftpChannel
olmadığın için PollableChannel
, bu hatayı aldın. Her neyse, bu farklı bir hikaye ve sftpChannel
o ağ geçidi sözleşmesiyle yapmaya çalıştığınız gibi bir mesaj göndererek yanıt olarak almak istediğiniz şey değil .
Daha açık konuşmanız ve arginsiz ağ geçidi sözleşmesi için neyin bir yük olarak kullanılacağını söylemeniz yeterlidir.
Dokümanlarda daha fazla bilgi görün: https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway-calling-no-argument-methods. Bu @Payload
sizin için bir cevaptır. Ya da bir belirtebilirsiniz payloadExpression
bu konuda @Gateway
açıklama ya da defaultPayloadExpression
üzerinde @MessagingGateway
.