使用Spring Integration FileWritingMessageHandler就地重命名文件

时间:2016-09-19 21:04:49

标签: 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;
}

更新

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;
}

1 个答案:

答案 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")。但正如我之前所说,它返回子目录中任何文件的绝对路径。