2015-01-13 5 views
0

Я работаю над фрагментом кода, который маршрутизирует с входа FTP в компонентный процесс, а затем на выход FTP. Процесс занимает около 15 минут, и когда он заканчивается, Camel пытается удалить входной файл с FTP-маршрута. В настоящее время FTP-сервер выдает ошибку:Ошибка Apache Camel FTP

13 Jan 2015 18:21:26 DEBUG org.apache.camel.component.file.remote.FtpOperations.deleteFile - Deleting file: ../flex-brazil/Portal_Forn/request_appr/364/NF_4.txt 
13 Jan 2015 18:21:26 WARN org.slf4j.helpers.MarkerIgnoringBase.warn - Error during commit. Exchange[[email protected]]. Caused by: [org.apache.camel.component.file.GenericFileOperationFailedException - File operation failed: 421 Timeout (900 seconds): closing control connection. 
FTP response 421 received. Server closed connection.. Code: 421] 
org.apache.camel.component.file.GenericFileOperationFailedException: File operation failed: 421 Timeout (900 seconds): closing control connection. 
FTP response 421 received. Server closed connection.. Code: 421 
at org.apache.camel.component.file.remote.FtpOperations.getCurrentDirectory(FtpOperations.java:701) 
at org.apache.camel.component.file.remote.FtpOperations.deleteFile(FtpOperations.java:224) 
at org.apache.camel.component.file.strategy.GenericFileDeleteProcessStrategy.commit(GenericFileDeleteProcessStrategy.java:71) 
at org.apache.camel.component.file.GenericFileOnCompletion.processStrategyCommit(GenericFileOnCompletion.java:124) 
at org.apache.camel.component.file.GenericFileOnCompletion.onCompletion(GenericFileOnCompletion.java:80) 
at org.apache.camel.component.file.GenericFileOnCompletion.onComplete(GenericFileOnCompletion.java:54) 
at org.apache.camel.util.UnitOfWorkHelper.doneSynchronizations(UnitOfWorkHelper.java:100) 
at org.apache.camel.impl.DefaultUnitOfWork.done(DefaultUnitOfWork.java:228) 
at org.apache.camel.util.UnitOfWorkHelper.doneUow(UnitOfWorkHelper.java:61) 
at org.apache.camel.processor.CamelInternalProcessor$UnitOfWorkProcessorAdvice.after(CamelInternalProcessor.java:613) 
at org.apache.camel.processor.CamelInternalProcessor$UnitOfWorkProcessorAdvice.after(CamelInternalProcessor.java:581) 
at org.apache.camel.processor.CamelInternalProcessor$InternalCallback.done(CamelInternalProcessor.java:240) 
at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:173) 
at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:401) 
at org.apache.camel.component.file.remote.RemoteFileConsumer.processExchange(RemoteFileConsumer.java:99) 
at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:201) 
at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:165) 
at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:187) 
at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:114) 
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:745) 
Caused by: org.apache.commons.net.ftp.FTPConnectionClosedException: FTP response 421 received. Server closed connection. 
at org.apache.commons.net.ftp.FTP.__getReply(FTP.java:367) 
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.sendCommand(FTP.java:582) 
at org.apache.commons.net.ftp.FTP.pwd(FTP.java:1454) 
at org.apache.commons.net.ftp.FTPClient.printWorkingDirectory(FTPClient.java:2658) 
at org.apache.camel.component.file.remote.FtpOperations.getCurrentDirectory(FtpOperations.java:697) 
... 25 more 

Есть какой-либо параметр, чтобы научить Camel отправить на FTP поддержку активности сервера, чтобы избежать этой ситуации?

ответ

3

Я предлагаю разделить весь процесс на два маршрута:

  1. Читатель Маршрут: только читает файл с FTP-сервера.
  2. процесса и Writer Маршрут: Этот маршрут обрабатывает входящее сообщение и пишет ответ на FTP-сервер

Преимущество заключается в том, что соединение будет закрыто после того, как чтение и удаление без исключения. Когда новое сообщение будет записано на сервер, будет создано новое соединение.

Первый маршрут может только закрыть соединение, когда процесс является асинхронным. Для этой цели вы можете использовать очереди для чтения и записи, например. seda или jms.

0

Вы можете рассмотреть возможность установки более крупного тайм-аута - по умолчанию 30 секунд.

Чтобы установить тайм-аут до 15 минут: ftp://[email protected]?timeout=900000

Имейте в виду, однако, что соединение может быть закрыто по FTP-сервер.