2012-07-05 154 views
3

我寫了一小段駱駝來使用ftp服務器。阿帕奇駱駝 - 失敗的FTP組件

但運行一段時間後,它會引發異常,繼續運行,但不會消耗任何東西。另外,當我再次啓動它時,有更多數量的文件正在等待被使用,它將再次崩潰。我已經添加了一個異常處理程序,但它似乎並沒有捕獲異常。

這是例外,我接受:

Caused by: [org.apache.camel.component.file.GenericFileOperationFailedException - File operation failed: 150 Opening ASCII mode data connection for 2386442.XML(3895 bytes). 
Accept timed out. Code: 150] 
org.apache.camel.component.file.GenericFileOperationFailedException: File operation failed: 150 Opening ASCII mode data connection for 2386442.XML(3895 bytes). 
Accept timed out. Code: 150 
    at org.apache.camel.component.file.remote.FtpOperations.retrieveFileToStreamInBody(FtpOperations.java:336) 
    at org.apache.camel.component.file.remote.FtpOperations.retrieveFile(FtpOperations.java:297) 
    at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:333) 
    at org.apache.camel.component.file.remote.RemoteFileConsumer.processExchange(RemoteFileConsumer.java:94) 
    at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:175) 
    at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:136) 
    at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:140) 
    at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:92) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) 
    at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317) 
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:180) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:204) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 
Caused by: java.net.SocketTimeoutException: Accept timed out 
    at java.net.PlainSocketImpl.socketAccept(Native Method) 
    at java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408) 
    at java.net.ServerSocket.implAccept(ServerSocket.java:462) 
    at java.net.ServerSocket.accept(ServerSocket.java:430) 
    at org.apache.commons.net.ftp.FTPClient._openDataConnection_(FTPClient.java:560) 
    at org.apache.commons.net.ftp.FTPClient.retrieveFile(FTPClient.java:1442) 
    at org.apache.camel.component.file.remote.FtpOperations.retrieveFileToStreamInBody(FtpOperations.java:328) 
    ... 16 more 
Caused by: [org.apache.camel.component.file.GenericFileOperationFailedException - Cannot retrieve file: GenericFile[2386448.XML] from: Endpoint[ftp://1.1.1.1?delay=15000&delete=true&disconnect=true&exclude=((?i).*pdf$)&password=******&username=user] 
org.apache.camel.component.file.GenericFileOperationFailedException: Cannot retrieve file: GenericFile[2386448.XML] from: Endpoint[ftp://1.1.1.1?delay=15000&delete=true&disconnect=true&exclude=((?i).*pdf$)&password=******&username=user] 
    at org.apache.camel.component.file.GenericFileConsumer.processExchange(GenericFileConsumer.java:338) 
    at org.apache.camel.component.file.remote.RemoteFileConsumer.processExchange(RemoteFileConsumer.java:94) 
    at org.apache.camel.component.file.GenericFileConsumer.processBatch(GenericFileConsumer.java:175) 
    at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:136) 
    at org.apache.camel.impl.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:140) 
    at org.apache.camel.impl.ScheduledPollConsumer.run(ScheduledPollConsumer.java:92) 
    at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:441) 
    at java.util.concurrent.FutureTask$Sync.innerRunAndReset(FutureTask.java:317) 
    at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:150) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$101(ScheduledThreadPoolExecutor.java:98) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.runPeriodic(ScheduledThreadPoolExecutor.java:180) 
    at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:204) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:662) 

這是我使用Java DSL所做的路線:

// XML Predicate 
    // only allows names without spaces 
    Predicate xmlPredicate = header(RssUtils.CAMEL_FILE_NAME).regex(
      "([\\S]+(\\.(?i)(xml))$)"); 
    // Images Predicate 
    // only allows names without spaces 
    Predicate imgPredicate = header(RssUtils.CAMEL_FILE_NAME).regex(
      "([\\S]+(\\.(?i)(jpg|png|gif))$)"); 

    onException(SchemaValidationException.class).to(
      "file://" + props.getProperty(RssUtils.ROOT_DIR) 
        + "/errors/SchemaValidationException"); 

    onException(GenericFileOperationFailedException.class).to(
      "file://" + props.getProperty(RssUtils.ROOT_DIR) 
        + "/errors/GenericFileExceptions"); 

    from(
      "ftp://" 
        + props.getProperty(RssUtils.FTP_URL) 
        + "?username=" 
        + props.getProperty(RssUtils.FTP_USER) 
        + "&password=" 
        + props.getProperty(RssUtils.FTP_PWD) 
        + "&disconnect=true&delete=true&exclude=((?i).*pdf$)&delay=" 
        + props.getProperty(RssUtils.FTP_DELAY)) 
      .choice() 
      .when(xmlPredicate) 
      .to("jms:xmlQueue") 
    .to("jms:archiveQueue") 
      .when(imgPredicate) 
      .to("file://" + props.getProperty(RssUtils.ROOT_DIR) + "/img") 
      .otherwise() 
      .to("file://" + props.getProperty(RssUtils.ROOT_DIR) 
        + "/errors/other"); 

    from("jms:xmlQueue").to("validator:FtpXmlValidator.xsd") 
      .to("xslt://XmlToRssConverter.xsl") 
      .process(rssFeedProcessor) 
      .to("file://" + props.getProperty(RssUtils.ROOT_DIR) + "/rss/"); 

from("jms:archiveQueue") 
    .to("file://" + props.getProperty(RssUtils.ROOT_DIR) + "/archive/"); 

有什麼我可以做,以避免這種AF行爲?這真的很難測試,所以我希望有人在我的代碼中發現缺陷。我現在搜索了很長一段時間,但是我沒有找到任何可靠的東西。也許某種方式我可以調試這個問題?

也許有幾件事情,我發現有人可以給他因子評分上:處理

  • 使用(真)使用onException的
  • 時,我可以定下了居民消費的最大批量大小? (我可以用油門嗎?)
  • 使用顯式嘗試捕捉最後,因爲我使用的是Java DSL

如果我說這裏有什麼問題,我剛學駱駝不要拍我。 因此,如果任何人有上述代碼的建議,我將不勝感激!

非常感謝!

回答

0

表面上,沒有看到你的路線失敗的原因,這聽起來像你想要做的是handle and continue - 即,處理這個異常,並繼續你的路線,你離開了。每文檔:

可作爲駱駝的2.3
在駱駝2.3我們引入了一個新的選擇continued它允許您同時手柄繼續路由在原來的路線彷彿例外做不會發生。

例如只是忽略並繼續,如果IDontCareException被拋出,我們可以這樣做:

onException(IDontCareException).continued(true); 

這裏發生的是:

駱駝將捕獲異常並。 。 。只要忽略它並繼續在原始路由中進行路由。但是。 。 。它將首先路由該[onException]路由,然後繼續在原始路由中路由。

試試這個,它可能會解決您的問題。正如我上面所暗示的,取決於你的根本問題,這可能更多是一種繃帶,而不是一個適當的解決方案。更好的方法可能是找出FTP用戶失敗的原因。一眼看來,它無法找到名爲2386448.XML的文件。

一旦你確定問題的根源,你可以使用一個choice在正確的時間,以不同的表現,如:

.choice() 
    .when(isValidFtpResponse()) 
     .to(DIRECT_CONTINUE_FTP_ROUTE) 
    .otherwise() 
     .setBody(constant(null)) 
     .log(ERROR, "FTP failed: ${headers}") 
.end() 

希望,給你一些想法,並幫助您獲得通過這個問題。

1

這裏有一個FTP問題,它發生在Apache Camel中的事實在很大程度上是無關緊要的。

炸彈的指示器部分是:

在java.net.PlainSocketImpl.socketAccept(本機方法) 在java.net.PlainSocketImpl.accept(PlainSocketImpl.java:408) 在java的。 net.ServerSocket.implAccept(ServerSocket.java:462) at java.net.ServerSocket.accept(ServerSocket.java:430) at org.apache.commons.net.ftp.FTPClient。 openDataConnection(FTPClient.java:560)

org.apache.commons.net.ftp.FTPClient的openDataConnection方法是有支持主動模式FTP - 被動模式只是使用相同的端口,作爲命令,所以它不需要單獨的端口連接。

嘗試切換到被動模式(passiveMode = true,使用Apache Camel)。