使用轮询远程文件夹查找文件的Camel SFTP使用者,我有以下端点配置:
sftp://user@server:22\
?password=xxx\
&delete=false\
&move=.done\
&localWorkDirectory=/tmp\
&delay=60000
(\
是将结束行包裹在yaml中,它们都被拼接在一行上。)
使用此设置从用户的主目录下载文件时,它会尝试将远程文件移动到.done
目录(根据Camel文档,“。done”应该足够了)。但是,我得到例外:
org.apache.camel.component.file.GenericFileOperationFailedException -
Cannot create directory: /.done (could be because of denied permissions)
我拥有权限,因为我可以创建目录并使用bash中的交互式sftp命令手动重命名文件。
我已经通过Camel的处理进行了调试,发现文件的父文件夹(CamelFileParent标头)被评估为"/"
,这意味着重命名文件的最终路径被评估为"//.done/some-file-name.csv"
。当然,这是错误的,并且由于上述异常而失败。
问题是为什么它无法解析主目录?当我尝试在交互式sftp命令中运行pwd
时,它会正确解析为"/home/user"
。
经过多次调试后,我发现camel是如何解析父文件夹路径的,它完全基于File类,并且它不会在远程服务器上查询父文件夹:
String name = getRelativeFilePath();
File path;
if (name != null) {
path = new File(endpointPath, name);
} else {
path = new File(endpointPath);
}
parent = path.getParent();
其中endpointPath
为""
且name
为"some-file-name.csv"
,因此getParent()调用已解析为"/"
。
如何才能获得正确的主路径(实际上不会将路径硬编码到端点配置中)?这是一个错误吗?