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

Dec 18 2020

Я посмотрел здесь здесь , и я не смог получить 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 вместо постоянного опроса файлового сервера.

Ответы

1 ArtemBilan Dec 18 2020 at 02:34

Да, история, упомянутая в 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.