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
Объект будет оцениваться по каждому сообщению запроса.
Подробнее смотрите в Справочном руководстве.