Как вызвать операции исходящего шлюза SFTP в конфигурации из компонента в Spring

Я посмотрел здесь здесь и не могу заставить listFiles работать:

    @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 у меня есть это:

    @Autowired
    MyGateway gateway;

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

когда я запускаю это, я получаю сообщение об ошибке receive is not supported, because no pollable reply channel has been configured

Я предполагаю, что это проблема с моим знанием/пониманием каналов интеграции. Возможно, мне не хватает bean-компонента, но моя главная цель здесь - заменить мое текущее использование адаптера inboundchannel для запроса файлов ad hoc вместо постоянного опроса файлового сервера.

Может ли это быть той же проблемой, что и в stackoverflow.com/questions/9790323/…?

Kaj Hejer 17.12.2020 20:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
748
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Да, история, упомянутая в Spring Integration Gateway без аргументов, определенно связана с вашей проблемой.

Вы упускаете из виду, что контракт List<File> listFiles() приходит без аргументов, поэтому фреймворку непонятно, что использовать для отправки на этот sftpChannel. Поэтому попробуйте вызвать receive. Но так как ваш sftpChannel не PollableChannel, вы получили эту ошибку. В любом случае, это другая история, а не то, что вы хотите получить в качестве ответа на отправку сообщения в sftpChannel, как вы пытаетесь сделать с этим шлюзовым контрактом.

Вам просто нужно быть более точным и сказать, что использовать в качестве полезной нагрузки для этого шлюзового контракта без аргументов.

См. дополнительную информацию в документах: https://docs.spring.io/spring-integration/docs/current/reference/html/messaging-endpoints.html#gateway-calling-no-argument-methods. @Payload это ответ для вас. Или вы можете указать payloadExpression на этой аннотации @Gateway или defaultPayloadExpression на @MessagingGateway.

Может быть, уже слишком поздно, но вы также можете изменить свой контракт шлюза без аргументов на контракт с одним аргументом, в котором нечего дополнительно аннотировать.

@MessagingGateway
public interface MyGateway {
     @Gateway(requestChannel = "sftpChannel")
     List<File> listFiles(String remoteDir);

}

@Bean
@ServiceActivator(inputChannel = "sftpChannel")
public MessageHandler handler() {
    return new SftpOutboundGateway(ftpSessionFactory(), Command.LS, "payload");
}

В вашем классе @Component у вас будет:

@Autowired
MyGateway gateway;

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

Другие вопросы по теме