Spring integration 使用Spring集成FileWritingMessageHandler就地重命名文件

Spring integration 使用Spring集成FileWritingMessageHandler就地重命名文件,spring-integration,Spring Integration,我试图使用FileWritingMessageHandler编写一个重命名文件的简单测试,但是我似乎不知道如何正确指定目标目录 由于我递归地扫描目录树,我最终只想从文件负载中读取父路径,并使用FileNameGenerator重命名它,但这似乎不起作用 DefaultFileNameGenerator中的“payload.name”可以正确解析,但“payload.path”不能正确解析 如何正确确定源文件的位置并在处理程序中使用它 编辑 这是扫描文件的通道适配器。我必须使用.setUseWat

我试图使用FileWritingMessageHandler编写一个重命名文件的简单测试,但是我似乎不知道如何正确指定目标目录

由于我递归地扫描目录树,我最终只想从文件负载中读取父路径,并使用FileNameGenerator重命名它,但这似乎不起作用

DefaultFileNameGenerator中的“payload.name”可以正确解析,但“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;
}
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;
}