Spring integration 使用Spring集成FileWritingMessageHandler就地重命名文件
我试图使用FileWritingMessageHandler编写一个重命名文件的简单测试,但是我似乎不知道如何正确指定目标目录 由于我递归地扫描目录树,我最终只想从文件负载中读取父路径,并使用FileNameGenerator重命名它,但这似乎不起作用 DefaultFileNameGenerator中的“payload.name”可以正确解析,但“payload.path”不能正确解析 如何正确确定源文件的位置并在处理程序中使用它 编辑 这是扫描文件的通道适配器。我必须使用Spring integration 使用Spring集成FileWritingMessageHandler就地重命名文件,spring-integration,Spring Integration,我试图使用FileWritingMessageHandler编写一个重命名文件的简单测试,但是我似乎不知道如何正确指定目标目录 由于我递归地扫描目录树,我最终只想从文件负载中读取父路径,并使用FileNameGenerator重命名它,但这似乎不起作用 DefaultFileNameGenerator中的“payload.name”可以正确解析,但“payload.path”不能正确解析 如何正确确定源文件的位置并在处理程序中使用它 编辑 这是扫描文件的通道适配器。我必须使用.setUseWat
.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;
}
DefaultFileNameGenerator中的“payload.name”可以正确解析,但“payload.path”不能正确解析
嗯,我不确定在您的情况下应该是什么,但对我来说,它总是返回源文件的完整的绝对路径,包括要扫描的根目录
既然您将其作为源目录
,那么如何在处理文件名生成器
中使用它将根目录从要使用的目标路径
断开?例如,如果我的根目录是/root
,并且我从子目录/root/foo/my_file.txt
,我可以执行payload.path.replaceFirst('/root','')
。因此,最后我只有/foo/my_file.txt
至少这就是我要做的,用提供的目录
的相对路径填充FileHeaders.FILENAME
,以进行扫描
更新
哦!!我懂了。不,那样不行。请参阅FileWritingMessageHandler
ctors。字符串
一旦接受静态目标目录。支持我们的案子。类似于newLiteralExpression(“payload.path”)
的代码也不会以理想的方式工作。请参见LiteralExpression
JavaDocs。它只是一个始终返回相同静态值的表达式
变量。在您的情况下,它是有效负载.path
如果您真的要根据传入的
消息进行评估
,则应该使用新的SpeLexpressionParser().parseExpression(“payload.path”)
。但正如我之前所说,它返回子目录中任何文件的绝对路径。您是否介意共享一个源代码适配器,以了解如何递归扫描?也许您的问题在于:谢谢Artem,我将尝试这种方法。我甚至尝试引入一个转换器,将一个新的父标题集添加到((File)message.getPayload()).getParent(),但仍然在ServiceActivator copyFileForProcessingOutboundChannelAdapter()行FileWritingMessageHandler adapter=new FileWritingMessageHandler(“headers.PARENT”);只需创建一个名为“headers.parent”的新目录,而不是从标题值中获取现有的父目录。请在我的答案中找到一个编辑
。谢谢Artem,这正是我所需要的!
@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;
}