2012-07-05 70 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)。