0

在camel 2.22.1中我使用了如下camel路由来执行文件操作

from(sftp://" + sourceUrl + "&preferredAuthentications=password&includeExt=xml&delete=true&disconnect=true&maxMessagesPerPoll=50&preMove=${file:name.noext}.process")

这会将扩展名为 .xml 的文件重命名为 .process 并执行进一步的路由操作,最后从输入文件夹中删除 .process 文件。然而骆驼 3.9.0 这条路线开始失败。我从 Camel 文件组件中得到以下错误:

org.apache.camel.component.file.GenericFileOperationFailedException: Cannot delete file: source/do-sfdc-case-import-0/2451165.process
    at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: com.jcraft.jsch.SftpException: No such file
    at org.apache.camel.component.file.remote.SftpOperations.deleteFile(SftpOperations.java:488)
    ... 22 common frames omitted

org.apache.camel.component.file.GenericFileOperationFailedException: Cannot change directory to: ..
    at java.base/java.lang.Thread.run(Thread.java:829)
Caused by: com.jcraft.jsch.SftpException:   
    at org.apache.camel.component.file.remote.SftpOperations.doChangeDirectory(SftpOperations.java:682)
    ... 11 common frames omitted
Caused by: java.io.IOException: Pipe closed 
    at com.jcraft.jsch.ChannelSftp.cd(ChannelSftp.java:337)
    ... 12 common frames omitted

为了解决这个问题,我尝试设置stepwise=false标志,但是应用程序变得非常慢,即使此堆栈跟踪中提到的文件在文件夹中可用,但骆驼报告它找不到或无法更改到相应的目录。

知道我在这里做错了什么吗?感谢任何帮助/提示。

4

1 回答 1

0

经过几次测试和调试会话后,我从我的应用程序中了解到 Camel/jsch 不能非常有效地处理多线程,经过几次谷歌搜索后,我发现了这个邮件线程https://www.mail-archive.com/search? l=users@camel.apache.org&q=subject:%22GenericFileOperationFailedException%22&o=newest&f=1支持我的camel/jsch和多线程理论。

总是存在时间问题,因为当路由尝试删除特定文件夹中的文件时,该文件已被删除,这导致路由中出现上述错误。而且,在阅读了 camel-sftp 文档后,我使用了synchronous=true确保骆驼严格同步处理路由的标志,问题为我解决了。

于 2021-12-08T10:14:03.407 回答