Cara memanggil operasi Gateway Keluar SFTP di Konfigurasi dari Komponen di Musim Semi
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
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 sftpChannel
bukan PollableChannel
Anda, Anda mendapatkan kesalahan itu. Bagaimanapun itu adalah cerita yang berbeda dan bukan apa yang ingin Anda dapatkan sebagai balasan dari mengirim pesan ke sftpChannel
seperti 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 @Payload
adalah jawaban untuk Anda. Atau Anda dapat menentukan payloadExpression
pada @Gateway
anotasi itu atau defaultPayloadExpression
pada @MessagingGateway
.