Spring'de Bileşenden Yapılandırmada SFTP Giden Ağ Geçidi işlemleri nasıl çağrılır

Dec 18 2020

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

1 ArtemBilan Dec 18 2020 at 02:34

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 sftpChannelolmadığın için PollableChannel, bu hatayı aldın. Her neyse, bu farklı bir hikaye ve sftpChannelo 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 @Payloadsizin için bir cevaptır. Ya da bir belirtebilirsiniz payloadExpressionbu konuda @Gatewayaçıklama ya da defaultPayloadExpressionüzerinde @MessagingGateway.