我正在尝试编写一个使用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;
}
更新
Artem帮助我理解了我的错误。
通过使用Artem概述的SpelExpressionParser,我能够达到预期的效果。
关键是:
new SpelExpressionParser().parseExpression("payload.parent")
where&#34; payload.parent&#34;正确解析为文件父路径。
@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;
}
答案 0 :(得分:2)
DefaultFileNameGenerator中的'payload.name'正确解析,但'payload.path'不能解析。
好吧,我不确定你的情况应该是什么,但对我来说总是会返回完整源文件的绝对路径,包括要扫描的根目录。
由于您将其作为sourceDirectory
使用,如何在processingFileNameGenerator
中使用它来切断目标path
的根目录?例如,如果我的根目录是/root
并且我从子目录/root/foo/my_file.txt
获取了一个文件,那么我可以payload.path.replaceFirst('/root', '')
。所以最后我只有/foo/my_file.txt
。
至少我要在JIRA中使用从提供的FileHeaders.FILENAME
扫描的相对路径来填充directory
。
<强>更新强>
哦!我知道了。不,那不会那样。见FileWritingMessageHandler
ctors。 String
一次接受静态目标目录。根本就是我们的情况。像new LiteralExpression("payload.path")
这样的代码也不会以预期的方式工作。请参阅LiteralExpression
JavaDocs。始终返回相同的静态值只是Expression
变体。在您的情况下,它是payload.path
。
如果您真的打算对传入的Message
进行评估,则应使用new SpeLexpressionParser().parseExpression("payload.path")
。但正如我之前所说,它返回子目录中任何文件的绝对路径。