java - Apache Camel : SFTP endpoint - Pipe closed issue

标签 java apache-camel

我正在使用一个路由,该路由使用 SFTP 将文件从远程服务器下载到本地目录。

Apache Camel 版本:2.15.2 从端点:sftp://xxx.xxx.xxx.xxx:xx//User/User01?delay=30s&include=File.*.csv&initialDelay=1m&password=xxxxxx&stepwise=false&streamDownload=true&username=User01 到端点:file:///var/opt/myfolder/incoming?doneFileName=${file:name}.done

远程位置有超过 10 个文件可供下载。下载 2-3 个文件后,路由卡住了,大约 30 秒后我在日志中收到以下错误:

DEBUG 04/11/15 07:45:24,183 org.apache.camel.component.file.FileOperations :Using InputStream to write file: /var/opt/myfolder/incoming/File01.csv 
... 
around 30 secs gap 
... 
INFO 04/11/15 07:49:53,820 org.apache.camel.component.file.remote.SftpOperations$JSchLogger :JSCH -> Caught an exception, leaving main loop due to Connection reset 
INFO 04/11/15 07:49:53,821 org.apache.camel.component.file.remote.SftpOperations$JSchLogger :JSCH -> Disconnecting from xxx.xxx.xxx.xxx port xx 
WARN 04/11/15 07:49:53,823 org.apache.camel.util.IOHelper :Cannot close: File01.csv. Reason: Pipe closed 
java.io.IOException: Pipe closed 
        at java.io.PipedInputStream.read(PipedInputStream.java:308) 
        at java.io.PipedInputStream.read(PipedInputStream.java:378) 
        at java.io.InputStream.skip(InputStream.java:222) 
        at com.jcraft.jsch.ChannelSftp.skip(ChannelSftp.java:2894) 
        at com.jcraft.jsch.ChannelSftp.access$600(ChannelSftp.java:36) 
        at com.jcraft.jsch.ChannelSftp$RequestQueue.cancel(ChannelSftp.java:1246) 
        at com.jcraft.jsch.ChannelSftp$2.close(ChannelSftp.java:1503) 
        at org.apache.camel.util.IOHelper.close(IOHelper.java:326) 
        at org.apache.camel.component.file.FileOperations.writeFileByStream(FileOperations.java:404) 
        at org.apache.camel.component.file.FileOperations.storeFile(FileOperations.java:274) 
        at org.apache.camel.component.file.GenericFileProducer.writeFile(GenericFileProducer.java:277) 
        at org.apache.camel.component.file.GenericFileProducer.processExchange(GenericFileProducer.java:165) 
        at org.apache.camel.component.file.GenericFileProducer.process(GenericFileProducer.java:79) 
        at org.apache.camel.util.AsyncProcessorConverterHelper$ProcessorToAsyncProcessorBridge.process(AsyncProcessorConverterHelper.java:61) 
        at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:129) 
        at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) 
        at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448) 
        at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) 
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:118) 
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:80) 
        at org.apache.camel.processor.ChoiceProcessor.process(ChoiceProcessor.java:111) 
        at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) 
        at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:448) 
        at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:191) 
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:118) 
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:80) 
        at org.apache.camel.util.AsyncProcessorHelper.process(AsyncProcessorHelper.java:109) 
        at org.apache.camel.processor.Pipeline.process(Pipeline.java:60) 
        at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:166) 
        at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:435) 
        at org.apache.camel.component.file.remote.RemoteFileConsumer.processExchange(RemoteFileConsumer.java:137) 
        at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:211) 
        at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:175) 
        at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174) 
        at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101) 
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304) 
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178) 
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
        at java.lang.Thread.run(Thread.java:744) 

我已经设置了重新发送,所以它会重新尝试下载。重试发生在最后一个文件上,并且根据日志下载文件。但是当我检查文件夹时,文件大小为 0,甚至创建了 .done 文件,远程服务器上的实际文件大小为 28 KB。 对于其余文件,每个文件都出现以下错误,并且没有下载任何文件:

WARN 04/11/15 07:49:58,877 org.slf4j.helpers.MarkerIgnoringBase :Error processing file RemoteFile[/User/User01/File02.csv] due to Cannot retrieve file: /User/User01/File02.csv. Caused by: [org.apache.camel.component.file.GenericFileOperationFailedException - Cannot retrieve file: /User/User01/File02.csv] 
org.apache.camel.component.file.GenericFileOperationFailedException: Cannot retrieve file: /User/User01/File02.csv 
        at org.apache.camel.component.file.remote.SftpOperations.retrieveFileToStreamInBody(SftpOperations.java:651) 
        at org.apache.camel.component.file.remote.SftpOperations.retrieveFile(SftpOperations.java:594) 
        at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:396) 
        at org.apache.camel.component.file.remote.RemoteFileConsumer.processExchange(RemoteFileConsumer.java:137) 
        at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:211) 
        at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:175) 
        at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:174) 
        at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:101) 
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471) 
        at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:304) 
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:178) 
        at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293) 
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
        at java.lang.Thread.run(Thread.java:744) 
Caused by: 4: 
        at com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:1513) 
        at com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:1266) 
        at org.apache.camel.component.file.remote.SftpOperations.retrieveFileToStreamInBody(SftpOperations.java:636) 
        ... 14 more 
Caused by: java.io.IOException: Pipe closed 
        at java.io.PipedInputStream.read(PipedInputStream.java:308) 
        at com.jcraft.jsch.Channel$MyPipedInputStream.updateReadSide(Channel.java:362) 
        at com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:1287) 
        ... 16 more 

我尝试同时使用 disconnect=true 和 false,这两种情况都会出现问题。 有什么建议可能是错的吗?

最佳答案

您同时使用了 initial delay(消费者轮询文件之前的延迟)和 delay(下一次轮询之前的延迟)。两者都创建了一个时间缓冲区,即

Initialdelay+DownloadTime+Delay+WriteDestinationDirectoryTime

  1. 尝试只使用“延迟”。
  2. 尝试将时间戳附加到存储在目标中的文件。
  3. 试试 camel-ftp2

关于java - Apache Camel : SFTP endpoint - Pipe closed issue,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33520586/

相关文章:

java - 递归定义中的堆栈溢出错误

java - 如果上一个路由没有执行完,则不要启动该路由

apache-camel - Apache camel 从 kafka 路由到另一个 kafka 主题出错

java - 根据文件夹内容暂停 apache Camel 路由

java - 在反序列化过程中将空字符串忽略为 null

java - Jpa 存储库查询 - java.lang.Object;不能转换到模型

java - java中的多线程持久队列

java - Spring - @Autowiring 存储库不起作用。 @Autowiring 其他类有

java - 在 Apache Camel 中使用相同的 url 但不同的 http 方法发出 REST 请求时没有响应

java - Apache Camel 传递参数