Apache camel 递归方式的骆驼ftp导致ftp错误代码:226

Apache camel 递归方式的骆驼ftp导致ftp错误代码:226,apache-camel,ftp-client,camel-ftp,Apache Camel,Ftp Client,Camel Ftp,我有一个非常简单的ftp路由,可以从URL递归下载文件。让它在今天仍然运行是非常重要的 没有代理,没有额外的身份验证,没有防火墙。但是,它只下载第一个文件,然后套接字将被关闭。我尝试过不同的超时,但它们并没有解决问题。如果我不使用任何超时或额外配置选项,或者如果我使用注释掉的内容,则返回错误代码226,或者返回错误代码221。226似乎不是一个错误,因为它只是表示服务器完成了传输。我在下面复制的堆栈跟踪。我将感谢您的回复,并提前表示感谢 我正在使用的路线是复杂的,因为我必须根据计时器启动它 代码

我有一个非常简单的ftp路由,可以从URL递归下载文件。让它在今天仍然运行是非常重要的

没有代理,没有额外的身份验证,没有防火墙。但是,它只下载第一个文件,然后套接字将被关闭。我尝试过不同的超时,但它们并没有解决问题。如果我不使用任何超时或额外配置选项,或者如果我使用注释掉的内容,则返回错误代码226,或者返回错误代码221。226似乎不是一个错误,因为它只是表示服务器完成了传输。我在下面复制的堆栈跟踪。我将感谢您的回复,并提前表示感谢

我正在使用的路线是复杂的,因为我必须根据计时器启动它

代码: 更新1 我把它去掉了,没有它就可以了。但是,我不能从另一条路线启动,例如从计时器启动。因此,这是一个快速的黑客让FTP运行。我还复制了这里的代码,就像我使用幂等消费程序所做的那样,以便只下载那些尚未在磁盘上的文件。它可能对其他人也有用。有关更多信息,请参见此处()的幂等消费示例

Any further comments?

from(ConfigData.getConfigData().getFtpUrl() 
            + "?binary=true&"
            + "recursive=true&"
            + "passiveMode=true&"
            + "ftpClient.bufferSize=10000000&"
            + "localWorkDirectory=" + ConfigData.getConfigData().getLocalTmpDirectory())
    .idempotentConsumer(header("CamelFileName"), FileIdempotentRepository.fileIdempotentRepository(new File("data", "repo.dat")))
    .to("file:modelFiles")
    .log("Downloaded file ${file:name} complete.")
    .end(); 
堆栈跟踪 解决方案:


正如Upadete 1中所添加的,我不使用pollEnrich()。现在无法从计时器启动路由,但它可以工作。因此,我将结束这个问题。我真的很喜欢幂等消费者的想法(与原始问题无关)。

不要忘记,一个消费者可以删除旧的交换,保留新的交换


因此,您不想使用from(“ftp”).pollEnrich(“计时器”)而是from(“计时器”).pollEnrich(“ftp”)。

请参阅问题末尾的解决方案。

您使用哪种版本的Camel?并且,您可能希望将轮询文件中的maxMessagesPerPoll=1设置为仅轮询1文件。如果要从FTP服务器下载多个文件并保存到文件或其他FTP服务器,请参阅FTP示例:谢谢您的评论。我昨天不得不继续干下去。所以在试了一下之后,我把所有的东西都拿了出来,让它在没有定时器的情况下运行。这样很好用。我将检查maxMessagesPerPoll。我在尝试提取下载的tar.gzip文件时遇到了新的问题,但camel的问题已经不同了。我会给我的帖子写更新。事实上,我也想给正确答案的赏金,但删除了消息中没有找到赏金按钮的部分,但是我有赏金按钮。不过还是要谢谢你。我在FTP URI中用maxMessagesPerPoll=1测试了它。在这种情况下,没有例外,只是下载了子树中的一个文件。在引入consumer.delay=1000后,这一点没有改变。谢谢Jonathan,第一个问题是FTP似乎无法将pollRich:from(“smg”).pollRich().simple()转换为(“file:directoryforthefiles”)。如果有效,我可以将计时器路由到路由。您是否尝试使用正确的方法将simple放入端点:.pollEnrich(simple(“yoururlwithsimplevalue”)。若要执行此操作,请在simple表达式中构造URL。它适用于子树中要下载的第一项。可以下载了。然后在开始下载下一个项目时,发生异常。
Any further comments?

from(ConfigData.getConfigData().getFtpUrl() 
            + "?binary=true&"
            + "recursive=true&"
            + "passiveMode=true&"
            + "ftpClient.bufferSize=10000000&"
            + "localWorkDirectory=" + ConfigData.getConfigData().getLocalTmpDirectory())
    .idempotentConsumer(header("CamelFileName"), FileIdempotentRepository.fileIdempotentRepository(new File("data", "repo.dat")))
    .to("file:modelFiles")
    .log("Downloaded file ${file:name} complete.")
    .end(); 
2016-03-19 15:27:53,921 [WARN|org.apache.camel.component.file.remote.FtpConsumer|MarkerIgnoringBase] Error processing file RemoteFile[2009-03-25/BioModels_Database-r13-sbml_files.tar.gz] due to File operation failed: null socket closed. Code: 221. Caused by: [org.apache.camel.component.file.GenericFileOperationFailedException - File operation failed: null socket closed. Code: 221]
org.apache.camel.component.file.GenericFileOperationFailedException: File **operation failed: null socket closed. Code: 221**
[...]
Caused by: java.net.SocketException: socket closed
        at java.net.SocketInputStream.socketRead0(Native Method)
        at java.net.SocketInputStream.read(Unknown Source)
        at java.net.SocketInputStream.read(Unknown Source)
        at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
        at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
        at sun.nio.cs.StreamDecoder.read(Unknown Source)
        at java.io.InputStreamReader.read(Unknown Source)
        at java.io.BufferedReader.fill(Unknown Source)
        at java.io.BufferedReader.read(Unknown Source)
        at org.apache.commons.net.io.CRLFLineReader.readLine(CRLFLineReader.java:58)
        at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:314)
        at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:294)
        at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:483)
        at org.apache.commons.net.ftp.FTP.sendCommand(FTP.java:608)
        at org.apache.commons.net.ftp.FTP.cwd(FTP.java:828)
        at org.apache.commons.net.ftp.FTPClient.changeWorkingDirectory(FTPClient.java:1128)
        at org.apache.camel.component.file.remote.FtpOperations.doChangeDirectory(FtpOperations.java:769)

2016-03-19 12:42:16,068 [WARN|org.apache.camel.component.file.remote.FtpConsumer|MarkerIgnoringBase] Error processing file RemoteFile[2008-12-03/BioModels_Database-r12-sbml_files.tar.gz] due to File operation failed: null Socket Closed. Code: 226. Caused by: [org.apache.camel.component.file.GenericFileOperationFailedException - **File operation failed: null Socket Closed. Code: 226]**
[...]
Caused by: java.net.SocketException: Socket Closed
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.read(Unknown Source)
    at java.net.SocketInputStream.read(Unknown Source)
    at sun.nio.cs.StreamDecoder.readBytes(Unknown Source)
    at sun.nio.cs.StreamDecoder.implRead(Unknown Source)
    at sun.nio.cs.StreamDecoder.read(Unknown Source)
    at java.io.InputStreamReader.read(Unknown Source)
    at java.io.BufferedReader.fill(Unknown Source)
    at java.io.BufferedReader.read(Unknown Source)
    at org.apache.commons.net.io.CRLFLineReader.readLine(CRLFLineReader.java:58)
    at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:314)
    at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:294)
    at org.apache.commons.net.ftp.FTP.getReply(FTP.java:692)
    at org.apache.commons.net.ftp.FTPClient.completePendingCommand(FTPClient.java:1813)
    at org.apache.commons.net.ftp.FTPClient._retrieveFile(FTPClient.java:1885)
    at org.apache.commons.net.ftp.FTPClient.retrieveFile(FTPClient.java:1845)
    at org.apache.camel.component.file.remote.FtpOperations.retrieveFileToStreamInBody(FtpOperations.java:367)