Spring Integration FTP - создание динамического каталога с выражением удаленного каталога (конфигурация Java)

При использовании SFTP Session Factory (с настройкой Java) в Spring Integration я хотел бы динамически устанавливать каталог удаленного SFTP-сервера. Весенние документы говорят, что это возможно:

Spring Integration SFTP-адаптеры

SpEL и исходящий адаптер SFTP

Как и во многих других компонентах Spring Integration, вы можете воспользоваться поддержкой Spring Expression Language (SpEL) при настройке адаптера исходящего канала SFTP, указав два атрибута. remote-directory-expression а также remote-filename-generator-expression (см. выше). Контекст оценки выражения будет иметь Сообщение в качестве своего корневого объекта, что позволяет вам предоставлять выражения, которые могут динамически вычислять имя файла или существующий путь к каталогу на основе данных в сообщении (из полезных данных или заголовков). В приведенном выше примере мы определяем remote-filename-generator-expression атрибут со значением выражения, который вычисляет имя файла на основе его исходного имени, а также добавляет суффикс: -foo.

Но у меня проблемы с реализацией этого. Я не могу найти хороший пример, который использует язык выражений SpEL Spring. Приведенный ниже код работает и отправляет мои файлы в корневой каталог, как он есть ниже, или в конкретный каталог, если я ввожу его в LiteralExpression. Но я бы хотел поменять выражение LiteralExpression с SpelExpression, которое использует заголовок "path", аналогично тому, что я сделал с заголовком "file", который динамически корректирует загружаемое имя файла.

@Configuration
public class SftpConfig {

@Autowired
private SftpSettings sftpSettings;

@Bean
public SessionFactory<LsEntry> sftpSessionFactory() {
    DefaultSftpSessionFactory factory = new DefaultSftpSessionFactory(true);
    factory.setHost(sftpSettings.getHostname());
    factory.setPort(sftpSettings.getPort());
    factory.setUser(sftpSettings.getUsername());
    factory.setPassword(sftpSettings.getPassword());
    factory.setAllowUnknownKeys(true);
    return new CachingSessionFactory<LsEntry>(factory);
}

@Bean
@ServiceActivator(inputChannel = "toSftpChannel")
public MessageHandler handler() {
    SftpMessageHandler handler = new SftpMessageHandler(sftpSessionFactory());
    handler.setAutoCreateDirectory(true);                               // automatically create the remote directory
    handler.setRemoteDirectoryExpression(new LiteralExpression(""));
    handler.setFileNameGenerator(new FileNameGenerator() {
        @Override
        public String generateFileName(Message<?> message) {
            return (String) message.getHeaders().get("filename");
        }
    });
    return handler;
}

@MessagingGateway
public interface UploadGateway {

    @Gateway(requestChannel = "toSftpChannel")
    void upload(@Payload byte[] file, @Header("filename") String filename, @Header("path") String path);
}
}

Чтобы начать загрузку файла, я выполняю этот код

@Autowired
private UploadGateway gateway;

byte[] file = "test".getBytes();
path = "mydirectory";
filename = "myfilename";
gateway.upload(file, filename, path); // edited to correct parameter order error

1 ответ

Решение

Выражение SpEL может быть действительно сложным и динамичным. Для этого вы должны объявить парсер:

ExpressionParser EXPRESSION_PARSER = new SpelExpressionParser()

и использовать его для разбора этого выражения:

handler.setRemoteDirectoryExpression(EXPRESSION_PARSER.parseExpression("headers['path']"));

И результат Expression Объект будет оцениваться по каждому сообщению запроса.

Подробнее смотрите в Справочном руководстве.

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