Я пытаюсь написать простой тест переименования файлов на месте с помощью FileWritingMessageHandler, однако я не могу понять, как правильно указать целевой целевой каталог.Переименовать файл на месте с помощью Spring Integration FileWritingMessageHandler
Поскольку я рекурсивно просматриваю дерево каталогов, мне в конечном итоге хотелось бы просто прочитать родительский путь из полезной нагрузки файла и переименовать его с помощью FileNameGenerator, но это не работает.
«payload.name» в DefaultFileNameGenerator разрешает корректно, но «payload.path» этого не делает.
Как правильно определить местоположение исходного файла и использовать его в обработчике?
Редактировать
Вот адаптер канала, который сканирует файлы. Для достижения рекурсивного сканирования мне пришлось использовать .setUseWatchService(true)
.
@Bean
@InboundChannelAdapter(channel = "sourceFileChannel", poller = @Poller(fixedRate = "5000", maxMessagesPerPoll = "-1"))
public MessageSource<File> sourceFiles() {
CompositeFileListFilter<File> filters = new CompositeFileListFilter<>();
filters.addFilter(new SimplePatternFileListFilter(sourceFilenamePattern));
filters.addFilter(persistentFilter());
FileReadingMessageSource source = new FileReadingMessageSource();
source.setAutoCreateDirectory(true);
source.setDirectory(new File(sourceDirectory));
source.setFilter(filters);
source.setUseWatchService(true);
return source;
}
UPDATE
Артем помог мне понять мою ошибку.
Мне удалось достичь желаемого результата с помощью SpelExpressionParser, как указано в Artem.
Ключевое существо:
new SpelExpressionParser().parseExpression("payload.parent")
Где "payload.parent" решает файл родительского пути правильно.
@Bean
@ServiceActivator(inputChannel = "processingFileChannel")
public MessageHandler copyFileForProcessingOutboundChannelAdapter() {
FileWritingMessageHandler adapter = new FileWritingMessageHandler(new SpelExpressionParser().parseExpression("payload.parent"));
adapter.setDeleteSourceFiles(false);
adapter.setAutoCreateDirectory(true);
adapter.setExpectReply(false);
adapter.setFileNameGenerator(processingFileNameGenerator());
return adapter;
}
@Bean
public DefaultFileNameGenerator processingFileNameGenerator() {
DefaultFileNameGenerator defaultFileNameGenerator = new DefaultFileNameGenerator();
defaultFileNameGenerator.setExpression("'p_' + payload.name");
return defaultFileNameGenerator;
}
Не могли бы вы поделиться с адаптером 'source', чтобы выяснить, как вы« рекурсивно сканируете »? –
Возможно, ваша проблема здесь: https://jira.spring.io/browse/INT-832 –