Cara memanggil operasi Gateway Keluar SFTP di Konfigurasi dari Komponen di Musim Semi

Dec 18 2020

Saya telah melihat di sini dan tidak dapat membuat listFiles berfungsi:

    @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/'");
    }

di mana di kelas @Component saya, saya memiliki ini:

    @Autowired
    MyGateway gateway;

    public void list(){
        List<File> files = gateway.listFiles();
    }

ketika saya menjalankan ini, saya mendapatkan kesalahan receive is not supported, because no pollable reply channel has been configured

Saya menganggap ini adalah masalah dengan pengetahuan / pemahaman saya tentang saluran integrasi. Mungkin saya kehilangan kacang, tetapi tujuan utama saya di sini adalah untuk mengganti penggunaan adaptor saluran masuk saya saat ini untuk meminta file secara ad hoc alih-alih terus mengumpulkan server file

Jawaban

1 ArtemBilan Dec 18 2020 at 02:34

Ya, cerita yang disebutkan di Spring Integration Gateway tanpa argumen pasti terkait dengan masalah Anda.

Anda kehilangan fakta bahwa List<File> listFiles()kontrak datang tanpa argumen, jadi tidak jelas kerangka kerja apa yang akan digunakan untuk mengirim untuk itu sftpChannel. Oleh karena itu coba panggil receive. Tetapi karena sftpChannelbukan PollableChannelAnda, Anda mendapatkan kesalahan itu. Bagaimanapun itu adalah cerita yang berbeda dan bukan apa yang ingin Anda dapatkan sebagai balasan dari mengirim pesan ke sftpChannelseperti yang Anda coba lakukan dengan kontrak gateway itu.

Anda hanya perlu lebih eksplisit dan mengatakan apa yang akan digunakan sebagai payload untuk kontrak gateway tanpa argumen itu.

Lihat info lebih lanjut di dokumen: https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway-calling-no-argument-methods. The @Payloadadalah jawaban untuk Anda. Atau Anda dapat menentukan payloadExpressionpada @Gatewayanotasi itu atau defaultPayloadExpressionpada @MessagingGateway.